C# , C++ È¥ÇÕ ÇÁ·Î±×·¡¹Ö 1Àå

¸ÞÀÎÇÁ·¹ÀÓ, UI´Â C#À¸·Î ·»´õ¸µ ¿£ÁøÀº C++À¸·Î ¸¸µé¾î C++ ÇÔ¼ö¸¦ C#¿¡¼­ È£ÃâÇÏ´Â ±¸Á¶·Î ¸¸µé±â À§Çؼ­ C#¿¡¼­ C++À» È£ÃâÇÏ´Â ¹æ¹ý¿¡ ´ëÇؼ­ ¾Ë¾Æº¸ÀÚ.

¾î¶² ¹æ¹ýÀÌ È¿°úÀûÀÌ°í, ¼Óµµ°¡ ºü¸¥Áö´Â Áö±Ý ¾Ö±â ÇÒ ¼ö´Â ¾ø´Ù. ¾î´ÀÁ¤µµ ±Ô¸ð°¡ ÀÖ´Â ÇÁ·Î±×·¥À» ¸¸µé¾î º»ÈÄ Æò°¡¸¦ ÇÒ °ÍÀÌ´Ù.

C#¿¡¼­ C/C++¸¦ È£ÃâÇÏ´Â ¹æ¹ý 4°¡Áö¿¡ ´ëÇؼ­ ¼³¸íÇÑ´Ù.

1. C#¿¡¼­ Windows API È£Ãâ
2. C#¿¡¼­ DLL CÇÔ¼ö È£Ãâ
3. C#¿¡¼­ DLL CÇÔ¼ö È£Ãâ Æ÷ÀÎÅÍ »ç¿ë
4. C#¿¡¼­ C++ È£Ãâ (ÄÜ¼Ö ¸ðµå¿¡¼­ ÄÄÆÄÀÏ)
5. C#¿¡¼­ C++ È£Ãâ (ÅëÇÕ È¯°æ¿¡¼­ ÄÄÆÄÀÏ1)
6. C#¿¡¼­ C++ È£Ãâ (ÅëÇÕ È¯°æ¿¡¼­ ÄÄÆÄÀÏ2)
7. C#¿¡¼­ C++ È£Ãâ (³×ÀÌƼºê C++)

 

1. C#¿¡¼­ Windows API È£Ãâ

C#¿¡¼­ Windows API¸¦ È£Ãâ ÇÏ´Â ¹æ¹ýÀº °£´ÜÇÏ´Ù.
°³³ä ¼³¸íÀº »ý·«ÇÏ°í »ç¿ë ¹æ¹ý¸¸ °£´ÜÈ÷ ³ª¿­ÇÑ´Ù.

managedÄڵ忡¼­ unmanagedÄڵ带 È£ÃâÇÏ´Â ·±Å¸ÀÓÀÇ Æ¯Â¡À» "Platform Invoke"¶ó ÇÑ´Ù.

Invoke Çϱâ À§Çؼ­´Â :       "using System.Runtime.InteropServices"À» ¼±¾ðÇÑ´Ù.
»ç¿ëÇÒ DLL ¶óÀ̺귯¸® ¼±¾ð :  "[DllImport("user32.dll")]"
ÇÔ¼ö ¿øÇü ¼±¾ð : "public static extern int MessageBox(~~~~)"
ÇÔ¼ö È£Ãâ

using System;

using System.Runtime.InteropServices;

 

class CTest

{

    const int SM_CMONITORS  = 80;

 

    [DllImport("user32.dll")]

    public static extern int MessageBox(int hWnd, string str, string caption, int type);

    [DllImport("user32.dll")]

    public static extern int GetSystemMetrics(int index);

 

    public static void Main()

    {

        int num = GetSystemMetrics( SM_CMONITORS );

        string str = String.Format("¸ð´ÏÅÍ °¹¼ö:  {0} °³", num);

        int ret = MessageBox(0, str, "¸ð´ÏÅÍ°¹¼ö", 0);

    }

}

API ¸¶´Ù °¢°¢ DLLImport¸¦ ½ÃÄÑÁØ´Ù.
°°Àº DLL¸¦ »ç¿ëÇÑ´Ù°í DLLImport¸¦ ÇÏÁö ¾Ê´Â´Ù¸é ¿ö´×¿¡·¯¸¸ ¶°°í ÄÄÆÄÀÏ µÇ´õ¶óµµ, Á¤»óÀûÀÎ ½ÇÇàÀÌ ¾ÈµÈ´Ù.

2. C#¿¡¼­ DLL CÇÔ¼ö È£Ãâ(call_mydll.zip)

API È£Ãâ°ú ¸¶Âù°¡Áö·Î ¾î·Á¿îÁ¡ÀÌ ¾ø´Ù.

//C DLL ÇÔ¼ö, µÎ¼ö¸¦ ³Ñ°ÜÁÖ¸é ´õÇϱâ, »©±â °á°ú¸¦ µÇµ¹·Á ÁØ´Ù.

extern "C" DLL_DECLSPEC void GetAdd(RESULT_NUM * pRet, TWO_NUM* pNum)

{

    pRet->add = pNum->a + pNum->b;

    pRet->sub = pNum->a - pNum->b;

}

À§ÀÇ ³×ÀÌƼºê DLL ÇÔ¼ö¸¦ È£ÃâÇÏ´Â C#ÄÚµå´Â ¾Æ·¡¿Í °°´Ù.

struct RESULT_NUM

{

    public int add;

    public int sub;

};

 

struct TWO_NUM

{

    public int a;

    public int b;

};

 

class CTest

{

    [DllImport("user32.dll")]

    public static extern int MessageBox( int hWnd, string str, string caption, int type);

    [DllImport("dll_server.dll")]

    public static extern void GetAdd( out RESULT_NUM ret, ref TWO_NUM  num);

 

    public static void Main()

    {

        RESULT_NUM ret;

 

        TWO_NUM num;

        num.a = 3;

        num.b = 7;

 

        GetAdd( out ret, ref num);

 

        string str = String.Format("ADD = {0}  \nSUB = {1}", ret.add, ret.sub);

        MessageBox(0, str, "RESULT", 0);

    }

}

dll_server.dllÀº ·ÎµùÇϱâ À§ÇØ C#ÇÁ·ÎÁ§Æ®ÀÇ bin/Debug/ Æú´õ¿¡ º¹»çÇÑ´Ù.
(DLLµµ ÇÔ²² µð¹ö±ë ÇÏ°í ½Í´Ù¸é ¿©±â¸¦ Âü°í)

dll_server.dll¿¡ »ç¿ëµÈ ±¸Á¶Ã¼¸¦ ¼±¾ðÇÑ´Ù. (³×ÀÌƼºê¿¡ »ç¿ëµÈ ±¸Á¶Ã¼¿Í ºñ½ÁÇÑ ±¸Á¶Ã¼¸¦ ¼±¾ð)
dll_server.dll ÀÓÆ÷Æ®
GetAdd() ÇÔ¼ö ¸ÅÇÎ (¸Å°³º¯¼ö°¡ Æ÷ÀÎÅ͸¦ »ç¿ëÇÑ ¹æ¹ýÀ̱⠶§¹®¿¡ out, ref¸¦ »ç¿ëÇÑ´Ù.)

Æ÷ÀÎÅÍ¿¡ °üÇÑ º¯È¯ ¹æ¹ý

±¸Á¶Ã¼³ª int, long Æ÷ÀÎÅÍ °æ¿ì :
DLL¿¡ º¯¼ö¸¦ ³Ñ°ÜÁÖ¸é ref ¼±¾ð
DLL¿¡¼­ °ªÀ» ¸®ÅÏ ¹Þ´Â °æ¿ì out ¼±¾ð

ref, out ¸ðµÎ ÂüÁ¶¿¡ÀÇ È£ÃâÀÌ´Ù. ref´Â È£ÃâÇϴ°÷¿¡¼­ ÇҴ砵Ǹç, outÀº È£ÃâµÇ´Â °÷¿¡¼­ °ªÀÌ ÇÒ´ç µÈ´Ù.

Æ÷ÀÎÅÍ¿¡ ¹öÆÛÀ» ³Ñ±â´Â °æ¿ì :   void * buffer --> byte[] buffer·Î ¼±¾ð

3. C#¿¡¼­ DLL CÇÔ¼ö È£Ãâ Æ÷ÀÎÅÍ »ç¿ë(call_mydll_unsafe.zip)

C#¿¡¼­ Æ÷ÀÎÅ͸¦ »ç¿ëÇÏ´Â °æ¿ì´Â ºÎºÐÀûÀÎ ¼Óµµ ÃÖÀûÈ­, C DLL°úÀÇ Á÷°üÀûÀÎ ¿¬°áÀ» ÇÒ ¶§, »ç¿ëÇÑ´Ù.

C#¿¡¼­ Æ÷ÀÎÅ͸¦ »ç¿ë ÇÒ·Á¸é ±¸¼º ÆäÀÌÁöÀÇ ¿É¼ÇÀ» ¹Ù²Ù°í, Æ÷ÀÎÅÍ°¡ »ç¿ëµÇ´Â ¸Þ½îµå¿Í °ü¸® µÇÁö ¾ÊÀº DLL ÇÔ¼ö¿¡
unsafe Å°¿öµå¸¦ Ãß°¡ÇÑ´Ù.

¿É¼Ç º¯°æ:
ÇÁ·ÎÁ§Æ® ±¸¼º ÆäÀÌÁö > ±¸¼º¼Ó¼º > ºôµå > ÄÚµå»ý¼º > ¾ÈÀüÇÏÁö ¾ÊÀº ÄÚµå ºí·Ï Çã¿ë => true·Î º¯°æÈÄ¿¡ ÄÄÆÄÀÏ

unsafe Å°¿öµå Ãß°¡:

unsafe Å°¿öµå´Â ±¸Á¶Ã¼, Ŭ·¡½º, Çü½Ä ¸â¹ö, ¸Å°³º¯¼ö, ÄÚµå ºí·ÏµîÀ¸·Î ¼±¾ðÇÒ ¼ö ÀÖ´Ù.

unsafe
{
    //¿©±â¿¡¼­ Æ÷ÀÎÅ͸¦ »ç¿ëÇÑ´Ù.
}

 

    public unsafe static extern void GetAdd( RESULT_NUM * pRet, TWO_NUM * pNum);

 

    public unsafe static void Main()

    {

        RESULT_NUM ret;

 

        TWO_NUM num;

        num.a = 3;

        num.b = 7;

 

        GetAdd( &ret, &num);

 

        string str = String.Format("ADD = {0}  \nSUB = {1}", ret.add, ret.sub);

        MessageBox(0, str, "RESULT", 0);

    }

stackalloc : .NET °¡ºñÁö Ä÷º¼ÇÀ» »ç¿ëÇÏÁö ¾Ê´Â Áö¿ª º¯¼ö ¼±¾ð, C ·±Å¸ÀÓ ¶óÀ̺귯¸®ÀÇ Áö¿ª º¯¼ö¿Í °°´Ù.

unsafe
{    
    char* p = stackalloc char[256];
    for (int k = 0; k < 256; k++)
          p[k] = (char)k;
}

fix : unsafe ÄÁÅؽºÆ®¿¡¼­ fix¸¦ ¼±¾ðÇÏ¸é °¡ºñÁö Ä÷º¼Ç¿¡ ÀÇÇؼ­ º¯¼ö°¡ °íÁ¤µÈ´Ù.

unsafe public static void Main()
{
   Point pt = new Point();
   pt.x = 5;
   pt.y = 6;
   // pt°¡ GC¿¡ ÀÇÇؼ­ Á¦°ÅµÇ°Å³ª ¿Å°ÜÁöÁö ¾Êµµ·Ï °íÁ¤ÇÑ´Ù.
   fixed (int* p = &pt.x)
   {
      // ¿©±â¿¡¼­ int* º¯¼ö¸¦ »ç¿ëÇÑ´Ù!
   }
   // pt°¡ ÀÌÁ¦´Â °íÁ¤µÇ¾î ÀÖÁö ¾Ê´Ù, µû¶ó¼­ GC¿¡ ÀÇÇØ Á¦°ÅµÉ ¼ö ÀÖ´Ù.
   Console.WriteLine ("Point is: {0}", pt);
}

 

È¥ÇÕ¸ðµå¿¡¼­ µð¹ö±ë(MSDN¿¡¼­ Æß)

°ü¸®µÇ´Â DLLÀ» È£ÃâÇÏ´Â ³×ÀÌƼºê EXE¿¡¼­ È¥ÇÕ ¸ðµå µð¹ö±ëÀ» È°¼ºÈ­ÇÏ·Á¸é

1. ¼Ö·ç¼Ç Ž»ö±â¿¡¼­ ÇÁ·ÎÁ§Æ®¸¦ ¼±ÅÃÇÕ´Ï´Ù.

2. º¸±â ¸Þ´º¿¡¼­ ¼Ó¼º ÆäÀÌÁö¸¦ Ŭ¸¯ÇÕ´Ï´Ù.

3. <Project> ¼Ó¼º ÆäÀÌÁö ´ëÈ­ »óÀÚ¿¡¼­ ±¸¼º ¼Ó¼º Æú´õ¸¦ È®ÀåÇÏ°í µð¹ö±ëÀ» ¼±ÅÃÇÕ´Ï´Ù.

4. µð¹ö±ë Çü½ÄÀ» È¥ÇÕ ¶Ç´Â ÀÚµ¿À¸·Î ¼³Á¤ÇÕ´Ï´Ù.

 

³×ÀÌƼºê DLLÀ» È£ÃâÇÏ´Â °ü¸®µÇ´Â EXE¿¡¼­ È¥ÇÕ ¸ðµå µð¹ö±ëÀ» È°¼ºÈ­ÇÏ·Á¸é

1. ¼Ö·ç¼Ç Ž»ö±â¿¡¼­ ÇÁ·ÎÁ§Æ®¸¦ ¼±ÅÃÇÕ´Ï´Ù.

2. º¸±â ¸Þ´º¿¡¼­ ¼Ó¼º ÆäÀÌÁö¸¦ Ŭ¸¯ÇÕ´Ï´Ù.

3. ¼Ó¼º ÆäÀÌÁö¿¡¼­ µð¹ö±× ÅÇÀ» Ŭ¸¯ÇÕ´Ï´Ù.

4. µð¹ö°Å »ç¿ë ±×·ì ¾Æ·¡¿¡¼­ ºñ°ü¸® ÄÚµå µð¹ö±ë »ç¿ë È®ÀζõÀ» ¼±ÅÃÇÕ´Ï´Ù.
(2003¿¡¼­´Â "ºñ°ü¸® ÄÚµå µð¹ö±ë »ç¿ë"ÀÌ ´ë½Å "°ü¸®µÇÁö ¾Ê´Â µð¹ö±ë »ç¿ë"À̶ó Ç¥½Ã µÇ¾î ÀÖÀ½)