¸ÞÀÎÇÁ·¹ÀÓ, 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¸¦ ÇÏÁö ¾Ê´Â´Ù¸é ¿ö´×¿¡·¯¸¸ ¶°°í ÄÄÆÄÀÏ µÇ´õ¶óµµ, Á¤»óÀûÀÎ ½ÇÇàÀÌ ¾ÈµÈ´Ù.
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·Î ¼±¾ð
|
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¿¡¼´Â "ºñ°ü¸® ÄÚµå µð¹ö±ë »ç¿ë"ÀÌ ´ë½Å "°ü¸®µÇÁö ¾Ê´Â µð¹ö±ë »ç¿ë"À̶ó Ç¥½Ã µÇ¾î ÀÖÀ½)
|
|