æ è¦ï¼å¨ãcsdnå¼åé«æã2004年第03æä¸çãåå大æ³ââå°DLLåµå ¥EXEãä¸æï¼ä»ç»äºå¦ä½æä¸ä¸ªå¨æé¾æ¥åºä½ä¸ºä¸ä¸ªèµæºåµå ¥å°å¯æ§è¡æ件ï¼å¨å¯æ§è¡æ件è¿è¡æ¶ï¼èªå¨ä»èµæºä¸éæ¾åºæ¥ï¼éè¿éæå 载延è¿å®ç°ï¼¤ï¼¬ï¼¬å½æ°çå¨æå è½½ï¼ç¨åºéåºåå®ç°ä¸´æ¶æ件çèªå¨å é¤ï¼ä»è为解å³âDLL Hellâæä¾äºä¸ç§è§£å³æ¹æ¡ãè¿æ¯ä¸ä¸ªå¾å¥½ç设计ææ³ï¼èä¸è¯¥ä½è ä¹ç¨C++å®ç°äºï¼å¨Internetä¸ä¹æç¸ä¼¼çVBç¨åºï¼ä½å¨æä¸ææ¯è®ºåä¸æèµ·è¿ç§è®¾è®¡æ¹æ³æ¶ï¼æç½åæåºï¼âè¿ç§æ¹æ³å¥½æ¯å¥½ï¼ä½å°±æ¯å¯å¨éåº¦å¤ªæ ¢âãè¿æ¯å 为ç¨åºå¯å¨æ¶å®ç°DLLéæ¾ï¼ç¶ååå è½½éæ¾åºæ¥çDLLï¼è¿ä¸ªè¿ç¨ä¼èè´¹ä¸å®çæ¶é´ãé´äºæ¤é®é¢ï¼ç»è¿æç´¢ï¼æåºå¦ä¸ä¸ªè®¾è®¡æ¹æ¡ï¼DLLä½ä¸ºèµæºæ件åµå ¥ç¨åºï¼ä½ä¸éè¿è¡DLLéæ¾åå ¶éæ°å è½½ãæ¬æå°±æ¯å¯¹è¯¥è®¾è®¡æ¹æ¡çåçåæå使ç¨C#ç¼ç¨æ¥å®ç°è¯¥è®¾è®¡æ¹æ¡ã Â å ³é®è¯ï¼å¨æè°ç¨DLLï¼åµå ¥DLLï¼C#  æ£Â æï¼ ä¸ã     DLLä¸åºç¨ç¨åº å¨æé¾æ¥åºï¼ä¹ç§°ä¸ºDLLï¼å³ä¸ºâDynamic Link Libraryâç缩åï¼æ¯Microsoft Windowsæéè¦çç»æè¦ç´ ä¹ä¸ï¼æå¼Windowsç³»ç»æ件夹ï¼ä½ ä¼åç°æ件夹ä¸æå¾å¤DLLæ件ï¼Windowså°±æ¯å°ä¸äºä¸»è¦çç³»ç»åè½ä»¥DLL模åçå½¢å¼å®ç°ã å¨æé¾æ¥åºæ¯ä¸è½ç´æ¥æ§è¡çï¼ä¹ä¸è½æ¥æ¶æ¶æ¯ï¼å®åªæ¯ä¸ä¸ªç¬ç«çæ件ï¼å ¶ä¸å å«è½è¢«ç¨åºæå ¶å®DLLè°ç¨æ¥å®æä¸å®æä½çå½æ°(æ¹æ³ã注ï¼C#ä¸ä¸è¬ç§°ä¸ºâæ¹æ³â)ï¼ä½è¿äºå½æ°ä¸æ¯æ§è¡ç¨åºæ¬èº«çä¸é¨åï¼èæ¯æ ¹æ®è¿ç¨çéè¦æéè½½å ¥ï¼æ¤æ¶æè½åæ¥ä½ç¨ã DLLåªæå¨åºç¨ç¨åºéè¦æ¶æ被系ç»å è½½å°è¿ç¨çèæ空é´ä¸ï¼æ为è°ç¨è¿ç¨çä¸é¨åï¼æ¤æ¶è¯¥DLLä¹åªè½è¢«è¯¥è¿ç¨ç线ç¨è®¿é®ï¼å®çå¥æå¯ä»¥è¢«è°ç¨è¿ç¨æ使ç¨ï¼èè°ç¨è¿ç¨çå¥æä¹å¯ä»¥è¢«è¯¥DLLæ使ç¨ãå¨å åä¸ï¼ä¸ä¸ªDLLåªæä¸ä¸ªå®ä¾ï¼ä¸å®çç¼å¶ä¸å ·ä½çç¼ç¨è¯è¨åç¼è¯å¨é½æ²¡æå ³ç³»ï¼æ以å¯ä»¥éè¿DLLæ¥å®ç°æ··åè¯è¨ç¼ç¨ãDLLå½æ°ä¸ç代ç æå建çä»»ä½å¯¹è±¡ï¼å æ¬åéï¼é½å½è°ç¨å®ç线ç¨æè¿ç¨ææã ä¸é¢ååºäºå½ç¨åºä½¿ç¨ DLL æ¶æä¾çä¸äºä¼ç¹ï¼[1] 1)       使ç¨è¾å°çèµæº å½å¤ä¸ªç¨åºä½¿ç¨åä¸ä¸ªå½æ°åºæ¶ï¼DLL å¯ä»¥åå°å¨ç£çåç©çå åä¸å è½½ç代ç çéå¤éãè¿ä¸ä» å¯ä»¥å¤§å¤§å½±åå¨åå°è¿è¡çç¨åºï¼èä¸å¯ä»¥å¤§å¤§å½±åå ¶ä»å¨ Windows æä½ç³»ç»ä¸è¿è¡çç¨åºã 2)       æ¨å¹¿æ¨¡åå¼ä½ç³»ç»æ DLL æå©äºä¿è¿æ¨¡åå¼ç¨åºçå¼åãè¿å¯ä»¥å¸®å©æ¨å¼åè¦æ±æä¾å¤ä¸ªè¯è¨çæ¬ç大åç¨åºæè¦æ±å ·æ模åå¼ä½ç³»ç»æçç¨åºã模åå¼ç¨åºçä¸ä¸ªç¤ºä¾æ¯å ·æå¤ä¸ªå¯ä»¥å¨è¿è¡æ¶å¨æå è½½ç模åç计å¸ç¨åºã 3)       ç®åé¨ç½²åå®è£ å½ DLL ä¸çå½æ°éè¦æ´æ°æä¿®å¤æ¶ï¼é¨ç½²åå®è£ DLL ä¸è¦æ±éæ°å»ºç«ç¨åºä¸è¯¥ DLL çé¾æ¥ãæ¤å¤ï¼å¦æå¤ä¸ªç¨åºä½¿ç¨åä¸ä¸ª DLLï¼é£ä¹å¤ä¸ªç¨åºé½å°ä»è¯¥æ´æ°æä¿®å¤ä¸è·çãå½æ¨ä½¿ç¨å®ææ´æ°æä¿®å¤ç第ä¸æ¹ DLL æ¶ï¼æ¤é®é¢å¯è½ä¼æ´é¢ç¹å°åºç°ã äºã     DLLçè°ç¨ æ¯ç§ç¼ç¨è¯è¨è°ç¨DLLçæ¹æ³é½ä¸å°½ç¸åï¼å¨æ¤åªå¯¹ç¨C#è°ç¨DLLçæ¹æ³è¿è¡ä»ç»ãé¦å ,æ¨éè¦äºè§£ä»ä¹æ¯æ管,ä»ä¹æ¯éæ管ãä¸è¬å¯ä»¥è®¤ä¸ºï¼éæ管代ç 主è¦æ¯åºäºwin 32å¹³å°å¼åçDLLï¼activeXçç»ä»¶ï¼æ管代ç æ¯åºäº.netå¹³å°å¼åçãå¦ææ¨æ³æ·±å ¥äºè§£æ管ä¸éæ管çå ³ç³»ä¸åºå«ï¼åå®ä»¬çè¿è¡æºå¶ï¼è¯·æ¨èªè¡æ¥æ¾èµæï¼æ¬æ件å¨æ¤ä¸ä½è®¨è®ºã (ä¸)    è°ç¨DLLä¸çéæ管å½æ°ä¸è¬æ¹æ³ é¦å ï¼åºè¯¥å¨C#è¯è¨æºç¨åºä¸å£°æå¤é¨æ¹æ³ï¼å ¶åºæ¬å½¢å¼æ¯ï¼ [DLLImport(âDLLæ件â)] 修饰符 extern è¿ååéç±»å æ¹æ³å称 ï¼åæ°åè¡¨ï¼ å ¶ä¸ï¼ DLLæ件ï¼å å«å®ä¹å¤é¨æ¹æ³çåºæ件ã 修饰符ï¼Â 访é®ä¿®é¥°ç¬¦ï¼é¤äºabstract以å¤å¨å£°ææ¹æ³æ¶å¯ä»¥ä½¿ç¨ç修饰符ã è¿ååéç±»åï¼å¨DLLæ件ä¸ä½ éè°ç¨æ¹æ³çè¿ååéç±»åã æ¹æ³å称ï¼å¨DLLæ件ä¸ä½ éè°ç¨æ¹æ³çå称ã åæ°å表ï¼å¨DLLæ件ä¸ä½ éè°ç¨æ¹æ³çå表ã 注æï¼éè¦å¨ç¨åºå£°æä¸ä½¿ç¨System.Runtime.InteropServiceså½å空é´ã      DllImportåªè½æ¾ç½®å¨æ¹æ³å£°æä¸ã DLLæä»¶å¿ é¡»ä½äºç¨åºå½åç®å½æç³»ç»å®ä¹çæ¥è¯¢è·¯å¾ä¸ï¼å³ï¼ç³»ç»ç¯å¢åéä¸Pathæ设置çè·¯å¾ï¼ã è¿ååéç±»åãæ¹æ³å称ãåæ°å表ä¸å®è¦ä¸DLLæ件ä¸çå®ä¹ç¸ä¸è´ã  è¥è¦ä½¿ç¨å ¶å®å½æ°åï¼å¯ä»¥ä½¿ç¨EntryPointå±æ§è®¾ç½®ï¼å¦ï¼ [DllImport("user32.dll", EntryPoint="MessageBoxA")] static extern int MsgBox(int hWnd, string msg, string caption, int type); å ¶å®å¯éç DllImportAttribute å±æ§ï¼ CharSet æ示ç¨å¨å ¥å£ç¹ä¸çå符éï¼å¦ï¼CharSet=CharSet.Ansiï¼ SetLastError æ示æ¹æ³æ¯å¦ä¿ç Win32"ä¸ä¸é误"ï¼å¦ï¼SetLastError=trueï¼ ExactSpelling æ示 EntryPoint æ¯å¦å¿ é¡»ä¸æ示çå ¥å£ç¹çæ¼åå®å ¨å¹é ï¼å¦ï¼ExactSpelling=falseï¼ PreserveSigæ示æ¹æ³çç¾ååºå½è¢«ä¿çè¿æ¯è¢«è½¬æ¢ï¼ å¦ï¼PreserveSig=trueï¼ CallingConventionæç¤ºå ¥å£ç¹çè°ç¨çº¦å®ï¼ å¦ï¼CallingConvention=CallingConvention.Winapiï¼ Â æ¤å¤ï¼å ³äºâæ°æ®å°éå¤çâåâå°éæ°ååé»è¾æ éâ请åé å ¶å®ä¸äºæç« [2]ã C#ä¾åï¼ 1.      å¯å¨VS.NETï¼æ°å»ºä¸ä¸ªé¡¹ç®ï¼é¡¹ç®å称为âTzbâï¼æ¨¡æ¿ä¸ºâWindows åºç¨ç¨åºâã 2.      å¨âå·¥å ·ç®±âçâ Windows çªä½â项ä¸åå»âButtonâ项ï¼åâForm1âçªä½ä¸æ·»å ä¸ä¸ªæé®ã 3.      æ¹åæé®çå±æ§ï¼Name为 âB1âï¼Text为 âç¨DllImportè°ç¨DLLå¼¹åºæ示æ¡âï¼å¹¶å°æé®B1è°æ´å°éå½å¤§å°ï¼ç§»å°éå½ä½ç½®ã 4.      å¨ç±»è§å¾ä¸åå»âForm1âï¼æå¼âForm1ï¼csâ代ç è§å¾ï¼å¨ânamespace Tzbâä¸é¢è¾å ¥âusing System.Runtime.InteropServices;âï¼ä»¥å¯¼å ¥è¯¥å½å空é´ã 5.      å¨âForm1ï¼cs[设计]âè§å¾ä¸åå»æé®B1ï¼å¨âB1_Clickâæ¹æ³ä¸é¢ä½¿ç¨å ³é®å static å extern 声ææ¹æ³âMsgBoxâï¼å° DllImport å±æ§éå å°è¯¥æ¹æ³ï¼è¿éæ们è¦ä½¿ç¨çæ¯âuser32ï¼dllâä¸çâMessageBoxAâå½æ°ï¼å ·ä½ä»£ç å¦ä¸ï¼
[DllImport("user32.dll", EntryPoint="MessageBoxA")] static extern int MsgBox(int hWnd, string msg, string caption, int type); |
ç¶åå¨âB1_Clickâæ¹æ³ä½å æ·»å å¦ä¸ä»£ç ï¼ä»¥è°ç¨æ¹æ³âMsgBoxâï¼
MsgBox(0," è¿å°±æ¯ç¨ DllImport è°ç¨ DLL å¼¹åºçæ示æ¡å¦ï¼ "," æææ¯ ",0x30); |
 6.      æâF5âè¿è¡è¯¥ç¨åºï¼å¹¶ç¹å»æé®B1ï¼ä¾¿å¼¹åºå¦ä¸æ示æ¡ï¼
 (äº)    å¨æè£ è½½ãè°ç¨DLLä¸çéæ管å½æ° å¨ä¸é¢å·²ç»è¯´æäºå¦ä½ç¨DllImportè°ç¨DLLä¸çéæ管å½æ°ï¼ä½æ¯è¿ä¸ªæ¯å ¨å±çå½æ°ï¼åè¥DLLä¸çéæ管å½æ°æä¸ä¸ªéæåéSï¼æ¯æ¬¡è°ç¨è¿ä¸ªå½æ°çæ¶åï¼éæåéSå°±èªå¨å 1ãç»æï¼å½éè¦éæ°è®¡æ°æ¶ï¼å°±ä¸è½å¾åºæ³è¦çç»æãä¸é¢å°ç¨ä¾å说æï¼ 1.       DLLçå建 1)       å¯å¨Visual C++ 6.0ï¼ 2)       æ°å»ºä¸ä¸ªâWin32 Dynamic-Link Libraryâå·¥ç¨ï¼å·¥ç¨å称为âCountâï¼ 3)       å¨âDll kindâéæ©çé¢ä¸éæ©âA simple dll projectâï¼ 4)       æå¼Count.cppï¼æ·»å å¦ä¸ä»£ç ï¼
// 导åºå½æ°ï¼ä½¿ç¨â _stdcall â æ åè°ç¨ extern "C" _declspec(dllexport)int _stdcall count(int init); |
int _stdcall count(int init) {//count å½æ°ï¼ä½¿ç¨åæ° init åå§åéæçæ´å½¢åé S ï¼å¹¶ä½¿ S èªå 1 åè¿åè¯¥å¼ static int S=init; S++; return S; } |
5)       æâF7âè¿è¡ç¼è¯ï¼å¾å°Count.dllï¼å¨å·¥ç¨ç®å½ä¸çDebugæ件夹ä¸ï¼ã  2.        ç¨DllImportè°ç¨DLLä¸çcountå½æ° 1)       æå¼é¡¹ç®âTzbâï¼åâForm1âçªä½ä¸æ·»å ä¸ä¸ªæé®ã 2)       æ¹åæé®çå±æ§ï¼Name为 âB2âï¼Text为 âç¨DllImportè°ç¨DLLä¸countå½æ°âï¼å¹¶å°æé®B1è°æ´å°éå½å¤§å°ï¼ç§»å°éå½ä½ç½®ã 3)       æå¼âForm1ï¼csâ代ç è§å¾ï¼ä½¿ç¨å ³é®å static å extern 声ææ¹æ³âcountâï¼å¹¶ä½¿å ¶å ·ææ¥èª Count.dll ç导åºå½æ°countçå®ç°ï¼ä»£ç å¦ä¸ï¼ Â
[DllImport("Count.dll")] static extern int count(int init); |
4)       å¨âForm1ï¼cs[设计]âè§å¾ä¸åå»æé®B2ï¼å¨âB2_Clickâæ¹æ³ä½å æ·»å å¦ä¸ä»£ç ï¼
MessageBox.Show(" ç¨ DllImport è°ç¨ DLL ä¸ç count å½æ°ï¼ /n ä¼ å ¥çå®å为 0 ï¼å¾å°çç»ææ¯ï¼ "+count(0).ToString()," æææ¯ "); MessageBox.Show(" ç¨ DllImport è°ç¨ DLL ä¸ç count å½æ°ï¼ /n ä¼ å ¥çå®å为 10 ï¼å¾å°çç»ææ¯ï¼ "+count(10).ToString()+"/n ç»æå¯ä¸æ¯æ³è¦ç 11 å¦ï¼ï¼ï¼ "," æææ¯ "); MessageBox.Show(" æå¾ç»æ表æï¼ /n ç¨ DllImport è°ç¨ DLL ä¸çéæ管 /n å½æ°æ¯å ¨å±çãéæçå½æ°ï¼ï¼ï¼ "," æææ¯ "); |
 5)       æCount.dllå¤å¶å°é¡¹ç®âTzbâçbin/Debugæ件夹ä¸ï¼æâF5âè¿è¡è¯¥ç¨åºï¼å¹¶ç¹å»æé®B2ï¼ä¾¿å¼¹åºå¦ä¸ä¸ä¸ªæ示æ¡ï¼ Â
第1个æ示æ¡æ¾ç¤ºçæ¯è°ç¨âcount(0)âçç»æï¼ç¬¬2个æ示æ¡æ¾ç¤ºçæ¯è°ç¨âcount(10)âçç»æï¼ç±æå¾ç»æå¯ä»¥è¯æâç¨DllImportè°ç¨DLLä¸çéæ管å½æ°æ¯å ¨å±çãéæçå½æ°âãæ以ï¼ææ¶å并ä¸è½è¾¾å°æ们ç®çï¼å æ¤æ们éè¦ä½¿ç¨ä¸é¢æä»ç»çæ¹æ³ï¼C#å¨æè°ç¨DLLä¸çå½æ°ã     3.       C#å¨æè°ç¨DLLä¸çå½æ° å 为C#ä¸ä½¿ç¨DllImportæ¯ä¸è½åå¨æload/unload assemblyé£æ ·ï¼æ以åªè½åå©APIå½æ°äºãå¨kernel32.dllä¸ï¼ä¸å¨æåºè°ç¨æå ³çå½æ°å æ¬[3]ï¼ â LoadLibraryï¼æMFC çAfxLoadLibraryï¼ï¼è£ è½½å¨æåºã â¡GetProcAddressï¼è·åè¦å¼å ¥çå½æ°ï¼å°ç¬¦å·åææ è¯å·è½¬æ¢ä¸ºDLLå é¨å°åã â¢FreeLibraryï¼æMFCçAfxFreeLibraryï¼ï¼éæ¾å¨æé¾æ¥åºã å®ä»¬çåååå«æ¯ï¼ HMODULE LoadLibrary(LPCTSTR lpFileName); FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName); BOOL FreeLibrary(HMODULE hModule);  ç°å¨ï¼æ们å¯ä»¥ç¨IntPtr hModule=LoadLibrary(âCount.dllâ);æ¥è·å¾Dllçå¥æ,ç¨IntPtr farProc=GetProcAddress(hModule,â[email protected]â);æ¥è·å¾å½æ°çå ¥å£å°åã ä½æ¯ï¼ç¥éå½æ°çå ¥å£å°ååï¼ææ ·è°ç¨è¿ä¸ªå½æ°å¢ï¼å 为å¨C#ä¸æ¯æ²¡æå½æ°æéçï¼æ²¡æåC++é£æ ·çå½æ°æéè°ç¨æ¹å¼æ¥è°ç¨å½æ°ï¼æ以æ们å¾åå©å ¶å®æ¹æ³ãç»è¿ç 究ï¼åç°æ们å¯ä»¥éè¿ç»å使ç¨System.Reflection.EmitåSystem.Reflection.Assemblyéçç±»åå½æ°è¾¾å°æ们çç®çã为äºä»¥å使ç¨æ¹ä¾¿åå®ç°ä»£ç çå¤ç¨ï¼æ们å¯ä»¥ç¼åä¸ä¸ªç±»ã 1)       dldç±»çç¼åï¼ 1.      æå¼é¡¹ç®âTzbâï¼æå¼ç±»è§å¾ï¼å³å»âTzbâï¼éæ©âæ·»å â-->âç±»âï¼ç±»å设置为âdldâï¼å³dynamic loading dll çæ¯ä¸ªåè¯çå¼å¤´åæ¯ã 2.      添å æéçå½å空é´å声æåæ°ä¼ éæ¹å¼æ举ï¼
using System.Runtime.InteropServices; // ç¨ DllImport éç¨æ¤ å½åç©ºé´ using System.Reflection; // ä½¿ç¨ Assembly ç±»éç¨æ¤ å½åç©ºé´ using System.Reflection.Emit; // ä½¿ç¨ ILGenerator éç¨æ¤ å½åç©ºé´ |
         å¨âpublic class dldâä¸é¢æ·»å å¦ä¸ä»£ç 声æåæ°ä¼ éæ¹å¼æ举ï¼
/// <summary> /// åæ°ä¼ éæ¹å¼æ举 ,ByValue 表示å¼ä¼ é ,ByRef 表示åä¼ é /// </summary> public enum ModePass { ByValue = 0x0001, ByRef = 0x0002 } |
 3.      声æLoadLibraryãGetProcAddressãFreeLibraryåç§æåéhModuleåfarProcï¼
/// <summary> /// ååæ¯ :HMODULE LoadLibrary(LPCTSTR lpFileName); /// </summary> /// <param name="lpFileName">DLL æ件å </param> /// <returns> å½æ°åºæ¨¡åçå¥æ </returns> [DllImport("kernel32.dll")] static extern IntPtr LoadLibrary(string lpFileName); /// <summary> /// ååæ¯ : FARPROC GetProcAddress(HMODULE hModule, LPCWSTR lpProcName); /// </summary> /// <param name="hModule"> å å«éè°ç¨å½æ°çå½æ°åºæ¨¡åçå¥æ </param> /// <param name="lpProcName"> è°ç¨å½æ°çå称 </param> /// <returns> å½æ°æé </returns> [DllImport("kernel32.dll")] static extern IntPtr GetProcAddress(IntPtr hModule, string lpProcName); /// <summary> /// ååæ¯ : BOOL FreeLibrary(HMODULE hModule); /// </summary> /// <param name="hModule"> ééæ¾çå½æ°åºæ¨¡åçå¥æ </param> /// <returns> æ¯å¦å·²éæ¾æå®ç Dll</returns> [DllImport("kernel32",EntryPoint="FreeLibrary",SetLastError=true)] static extern bool FreeLibrary(IntPtr hModule); /// <summary> /// Loadlibrary è¿åçå½æ°åºæ¨¡åçå¥æ /// </summary> private IntPtr hModule=IntPtr.Zero; /// <summary> /// GetProcAddress è¿åçå½æ°æé /// </summary> private IntPtr farProc=IntPtr.Zero; |
 4.      添å LoadDllæ¹æ³ï¼å¹¶ä¸ºäºè°ç¨æ¶æ¹ä¾¿ï¼éè½½äºè¿ä¸ªæ¹æ³ï¼ Â
/// <summary> /// è£ è½½ Dll /// </summary> /// <param name="lpFileName">DLL æ件å </param> public void LoadDll(string lpFileName) { hModule=LoadLibrary(lpFileName); if(hModule==IntPtr.Zero) throw(new Exception(" 没ææ¾å° :"+lpFileName+"." )); } |
          è¥å·²æå·²è£ è½½Dllçå¥æï¼å¯ä»¥ä½¿ç¨LoadDllæ¹æ³ç第äºä¸ªçæ¬ï¼
public void LoadDll(IntPtr HMODULE) { if(HMODULE==IntPtr.Zero) throw(new Exception(" æä¼ å ¥çå½æ°åºæ¨¡åçå¥æ HMODULE 为空 ." )); hModule=HMODULE; } |
 5.      添å LoadFunæ¹æ³ï¼å¹¶ä¸ºäºè°ç¨æ¶æ¹ä¾¿ï¼ä¹éè½½äºè¿ä¸ªæ¹æ³ï¼æ¹æ³çå ·ä½ä»£ç å注éå¦ä¸ï¼
/// <summary> /// è·å¾å½æ°æé /// </summary> /// <param name="lpProcName"> è°ç¨å½æ°çå称 </param> public void LoadFun(string lpProcName) { // è¥å½æ°åºæ¨¡åçå¥æ为空ï¼åæåºå¼å¸¸ if(hModule==IntPtr.Zero) throw(new Exception(" å½æ°åºæ¨¡åçå¥æ为空 , 请确ä¿å·²è¿è¡ LoadDll æä½ !")); // åå¾å½æ°æé farProc = GetProcAddress(hModule,lpProcName); // è¥å½æ°æéï¼åæåºå¼å¸¸ if(farProc==IntPtr.Zero) throw(new Exception(" 没ææ¾å° :"+lpProcName+" è¿ä¸ªå½æ°çå ¥å£ç¹ ")); } /// <summary> /// è·å¾å½æ°æé /// </summary> /// <param name="lpFileName"> å å«éè°ç¨å½æ°ç DLL æ件å </param> /// <param name="lpProcName"> è°ç¨å½æ°çå称 </param> public void LoadFun(string lpFileName,string lpProcName) { // åå¾å½æ°åºæ¨¡åçå¥æ hModule=LoadLibrary(lpFileName); // è¥å½æ°åºæ¨¡åçå¥æ为空ï¼åæåºå¼å¸¸ if(hModule==IntPtr.Zero) throw(new Exception(" 没ææ¾å° :"+lpFileName+"." )); // åå¾å½æ°æé farProc = GetProcAddress(hModule,lpProcName); // è¥å½æ°æéï¼åæåºå¼å¸¸ if(farProc==IntPtr.Zero) throw(new Exception(" 没ææ¾å° :"+lpProcName+" è¿ä¸ªå½æ°çå ¥å£ç¹ ")); } |
 6.      添å UnLoadDllåInvokeæ¹æ³ï¼Invokeæ¹æ³ä¹è¿è¡äºéè½½ï¼
/// <summary> /// å¸è½½ Dll /// </summary> public void UnLoadDll() { FreeLibrary(hModule); hModule=IntPtr.Zero; farProc=IntPtr.Zero; } |
          Invokeæ¹æ³ç第ä¸ä¸ªçæ¬ï¼
/// <summary> /// è°ç¨æ设å®çå½æ° /// </summary> /// <param name="ObjArray_Parameter"> å®å </param> /// <param name="TypeArray_ParameterType"> å®åç±»å </param> /// <param name="ModePassArray_Parameter"> å®åä¼ éæ¹å¼ </param> /// <param name="Type_Return"> è¿åç±»å </param> /// <returns> è¿åæè°ç¨å½æ°ç object</returns> public object Invoke(object[] ObjArray_Parameter,Type[] TypeArray_ParameterType,ModePass[] ModePassArray_Parameter,Type Type_Return) { // ä¸é¢ 3 个 if æ¯è¿è¡å®å ¨æ£æ¥ , è¥ä¸è½éè¿ , åæåºå¼å¸¸ if(hModule==IntPtr.Zero) throw(new Exception(" å½æ°åºæ¨¡åçå¥æ为空 , 请确ä¿å·²è¿è¡ LoadDll æä½ !")); if(farProc==IntPtr.Zero) throw(new Exception(" å½æ°æé为空 , 请确ä¿å·²è¿è¡ LoadFun æä½ !" ) ); if(ObjArray_Parameter.Length!=ModePassArray_Parameter.Length) throw(new Exception(" åæ°ä¸ªæ°åå ¶ä¼ éæ¹å¼ç个æ°ä¸å¹é ." ) ); // ä¸é¢æ¯å建 MyAssemblyName å¯¹è±¡å¹¶è®¾ç½®å ¶ Name å±æ§ AssemblyName MyAssemblyName = new AssemblyName(); MyAssemblyName.Name = "InvokeFun"; // çæå模åé 件 AssemblyBuilder MyAssemblyBuilder =AppDomain.CurrentDomain.DefineDynamicAssembly(MyAssemblyName,AssemblyBuilderAccess.Run); ModuleBuilder MyModuleBuilder =MyAssemblyBuilder.DefineDynamicModule("InvokeDll"); // å®ä¹è¦è°ç¨çæ¹æ³ , æ¹æ³å为â MyFun âï¼è¿åç±»åæ¯â Type_Return âåæ°ç±»åæ¯â TypeArray_ParameterType â MethodBuilder MyMethodBuilder =MyModuleBuilder.DefineGlobalMethod("MyFun",MethodAttributes.Public| MethodAttributes.Static,Type_Return,TypeArray_ParameterType); // è·åä¸ä¸ª ILGenerator ï¼ç¨äºåéæéç IL ILGenerator IL = MyMethodBuilder.GetILGenerator(); int i; for (i = 0; i < ObjArray_Parameter.Length; i++) {// ç¨å¾ªç¯å°åæ°ä¾æ¬¡åå ¥å æ switch (ModePassArray_Parameter[i]) { case ModePass.ByValue: IL.Emit(OpCodes.Ldarg, i); break; case ModePass.ByRef: IL.Emit(OpCodes.Ldarga, i); break; default: throw(new Exception(" 第 " +(i+1).ToString() + " 个åæ°æ²¡æç»å®æ£ç¡®çä¼ éæ¹å¼ ." ) ); } } if (IntPtr.Size == 4) {// å¤æå¤çå¨ç±»å IL.Emit(OpCodes.Ldc_I4, farProc.ToInt32()); } else if (IntPtr.Size == 8) { IL.Emit(OpCodes.Ldc_I8, farProc.ToInt64()); } else { throw new PlatformNotSupportedException(); } IL.EmitCalli(OpCodes.Calli,CallingConvention.StdCall,Type_Return,TypeArray_ParameterType); IL.Emit(OpCodes.Ret); // è¿åå¼ MyModuleBuilder.CreateGlobalFunctions(); // åå¾æ¹æ³ä¿¡æ¯ MethodInfo MyMethodInfo = MyModuleBuilder.GetMethod("MyFun"); return MyMethodInfo.Invoke(null, ObjArray_Parameter);// è°ç¨æ¹æ³ï¼å¹¶è¿åå ¶å¼ } |
         Invokeæ¹æ³ç第äºä¸ªçæ¬ï¼å®æ¯è°ç¨äºç¬¬ä¸ä¸ªçæ¬çï¼
/// <summary> /// è°ç¨æ设å®çå½æ° /// </summary> /// <param name="IntPtr_Function"> å½æ°æé </param> /// <param name="ObjArray_Parameter"> å®å </param> /// <param name="TypeArray_ParameterType"> å®åç±»å </param> /// <param name="ModePassArray_Parameter"> å®åä¼ éæ¹å¼ </param> /// <param name="Type_Return"> è¿åç±»å </param> /// <returns> è¿åæè°ç¨å½æ°ç object</returns> public object Invoke(IntPtr IntPtr_Function,object[] ObjArray_Parameter,Type[] TypeArray_ParameterType,ModePass[] ModePassArray_Parameter,Type Type_Return) { // ä¸é¢ 2 个 if æ¯è¿è¡å®å ¨æ£æ¥ , è¥ä¸è½éè¿ , åæåºå¼å¸¸ if(hModule==IntPtr.Zero) throw(new Exception(" å½æ°åºæ¨¡åçå¥æ为空 , 请确ä¿å·²è¿è¡ LoadDll æä½ !")); if(IntPtr_Function==IntPtr.Zero) throw(new Exception(" å½æ°æé IntPtr_Function 为空 !" ) ); farProc=IntPtr_Function; return Invoke(ObjArray_Parameter,TypeArray_ParameterType,ModePassArray_Parameter,Type_Return); } |
  2)       dldç±»ç使ç¨ï¼ 1ï¼Â æå¼é¡¹ç®âTzbâï¼åâForm1âçªä½ä¸æ·»å ä¸ä¸ªæé®ãName åTextå±æ§åå«ä¸º âB3âãâç¨LoadLibraryæ¹æ³è£ è½½Count.dllâï¼âB4âãâè°ç¨countæ¹æ³âï¼âB5âãâå¸è½½Count.dllâï¼å¹¶è°æ´å°éå½ç大å°åä½ç½®ã 2ï¼Â å¨âForm1ï¼cs[设计]âè§å¾ä¸åå»æé®B3ï¼å¨âB3_Clickâæ¹æ³ä½ä¸é¢æ·»å 代ç ï¼å建ä¸ä¸ªdldç±»å®ä¾ï¼
/// <summary> /// å建ä¸ä¸ª dld 类对象 /// </summary> private dld myfun=new dld(); |
   3ï¼Â å¨âB3_Clickâæ¹æ³ä½å æ·»å å¦ä¸ä»£ç ï¼
myfun.LoadDll("Count.dll"); // å è½½ "Count.dll" myfun.LoadFun("[email protected]"); // è°å ¥å½æ° count, "[email protected]" æ¯å®çå ¥å£ï¼å¯éè¿ Depends æ¥ç |
 4ï¼Â âForm1ï¼cs[设计]âè§å¾ä¸åå»æé®B4ï¼å¨âB4_Clickâæ¹æ³ä½å æ·»å å¦ä¸ä»£ç ï¼
object[] Parameters = new object[]{(int)0}; // å®å为 0 Type[] ParameterTypes = new Type[]{typeof(int)}; // å®åç±»å为 int ModePass[] themode=new ModePass[]{ModePass.ByValue}; // ä¼ éæ¹å¼ä¸ºå¼ä¼ Type Type_Return = typeof(int); // è¿åç±»å为 int // å¼¹åºæ示æ¡ï¼æ¾ç¤ºè°ç¨ myfun.Invoke æ¹æ³çç»æï¼å³è°ç¨ count å½æ° MessageBox.Show(" è¿æ¯æ¨è£ 载该 Dll å第 "+myfun.Invoke(Parameters,ParameterTypes,themode,Type_Return).ToString() +" 次ç¹å»æ¤æé®ã "," æææ¯ "); |
Â
 5ï¼Â âForm1ï¼cs[设计]âè§å¾ä¸åå»æé®B5ï¼å¨âB5_Clickâæ¹æ³ä½å æ·»å å¦ä¸ä»£ç ï¼
myfun.UnLoadDll(); |
6ï¼Â æâF5âè¿è¡è¯¥ç¨åºï¼å¹¶å ç¹å»æé®B3以å è½½âCount.dllâï¼æ¥çç¹å»æé®B4ä¸æ¬¡ä»¥è°ç¨3次âcount(0)âï¼å åå¼¹åºçæ示æ¡å¦ä¸ï¼
         è¿ä¸ä¸ªæ示æ¡æå¾åºçç»æ说æäºéæåéS ç»åå§ååï¼åä¼ å ¥å®åâ0âä¹ä¸ä¼æ¹åå ¶å¼ä¸ºâ0âã 7ï¼Â ç¹å»æé®B5以å¸è½½âCount.dllâï¼åç¹å»æé®B3è¿è¡è£ è½½âCount.dllâï¼åç¹å»æé®B4æ¥çè°ç¨äºâcount(0)âçç»æï¼
ä»å¼¹åºçæ示æ¡ææ¾ç¤ºçç»æå¯ä»¥çå°åå¼å§éæ°è®¡æ°äºï¼ä¹å°±æ¯å®ç°äºDLLçå¨æè£ è½½ä¸å¸è½½äºã  (ä¸)    è°ç¨æ管DLLä¸è¬æ¹æ³ C# è°ç¨æ管DLLæ¯å¾ç®åçï¼åªè¦å¨â解å³æ¹æ¡èµæºç®¡çå¨âä¸çéè¦è°ç¨DLLç项ç®ä¸ç¨é¼ æ å³å»âå¼ç¨âï¼å¹¶éæ©âæ·»å å¼ç¨âï¼ç¶åéæ©å·²ååºçDLLæéè¿æµè§æ¥éæ©DLLæ件ï¼æåéè¦ç¨using å¯¼å ¥ç¸å ³çå½å空é´ã (å)    å¨æè°ç¨æ管DLL C# å¨æè°ç¨æ管DLLä¹éè¦åå©System.Reflection.Assemblyéçç±»åæ¹æ³ï¼ä¸»è¦ä½¿ç¨äºAssembly.LoadFromãç°å¨ï¼ç¨ä¾å说æï¼ Â Â Â Â é¦å ï¼å¯å¨VS.NETï¼æ°å»ºä¸ä¸ªVisual C# 项ç®ï¼ä½¿ç¨ç模æ¿ä¸ºâç±»åºâï¼å称为âCsCountâï¼å¹¶å¨ç±»âClass1âä¸æ·»å éææ´ååéSåæ¹æ³countï¼
// ç±äº static ä¸è½ä¿®é¥°æ¹æ³ä½å çåéï¼æ以éæ¾å¨è¿éï¼ä¸åå§åå¼ä¸º int.MinValue static int S=int.MinValue; public int count(int init) {// å¤æ S æ¯å¦çäº int.MinValue ï¼æ¯çè¯æ init èµå¼ç» S if(S==int.MinValue) S=init; S++; //S èªå¢ 1 return S; // è¿å S } |
 ç¶åï¼æå¼é¡¹ç®âTzbâï¼åâForm1âçªä½ä¸æ·»å ä¸ä¸ªæé®ï¼Nameå±æ§ä¸ºâB6âï¼Textå±æ§ä¸ºâç¨Assemblyç±»æ¥å¨æè°ç¨æ管DLLâï¼è°æ´å°éå½å¤§å°åä½ç½®ï¼åå»æé®B6ï¼è½¬å ¥ä»£ç è§å¾ï¼å å¯¼å ¥å½å空é´ï¼using System.Reflection; æ¥çæ·»å Invokeæ¹æ³åB6_Clickæ¹æ³ä»£ç ï¼
private object Invoke(string lpFileName,string Namespace,string ClassName,string lpProcName,object[] ObjArray_Parameter) { Try { // è½½å ¥ç¨åºé Assembly MyAssembly=Assembly.LoadFrom(lpFileName); Type[] type=MyAssembly.GetTypes(); foreach(Type t in type) {// æ¥æ¾è¦è°ç¨çå½å空é´åç±» if(t.Namespace==Namespace&&t.Name==ClassName) {// æ¥æ¾è¦è°ç¨çæ¹æ³å¹¶è¿è¡è°ç¨ MethodInfo m=t.GetMethod(lpProcName); if(m!=null) { object o=Activator.CreateInstance(t); return m.Invoke(o,ObjArray_Parameter); } else MessageBox.Show(" è£ è½½åºé !"); } } }//try catch(System.NullReferenceException e) { MessageBox.Show(e.Message); }//catch return (object)0; }// Invoke |
 âB6_Clickâæ¹æ³ä½å 代ç å¦ä¸ï¼
// æ¾ç¤º count(0) è¿åçå¼ MessageBox.Show(" è¿æ¯æ¨ç¬¬ "+Invoke("CsCount.dll","CsCount","Class1","count",new object[]{(int)0}).ToString()+" 次ç¹å»æ¤æé®ã "," æææ¯ "); |
 æåï¼æ项ç®âCsCountâçbin/Debugæ件夹ä¸çCsCount.dllå¤å¶å°é¡¹ç®âTzbâçbin/Debugæ件夹ä¸ï¼æâF5âè¿è¡è¯¥ç¨åºï¼å¹¶ç¹å»æé®B6ä¸æ¬¡ï¼å°ä¼å¼¹åº3个æ示æ¡ï¼å 容åå«æ¯âè¿æ¯æ¨ç¬¬ 1次ç¹å»æ¤æé®ãâãâè¿æ¯æ¨ç¬¬ 2次ç¹å»æ¤æé®ãâãâè¿æ¯æ¨ç¬¬ 3次ç¹å»æ¤æé®ãâï¼ç±æ¤ç¥éäºéæåéSå¨è¿éçä½ç¨ã  (äº) C#ç¨åºåµå ¥DLLçè°ç¨     DLLæ件ä½ä¸ºèµæºåµå ¥å¨C#ç¨åºä¸ï¼æ们åªè¦è¯»å该èµæºæ件并以âbyte[]âè¿åï¼ç¶åå°±ç¨âAssembly Load(byte[]);âå¾å°DLLä¸çç¨åºéï¼æåå°±å¯ä»¥åä¸é¢çInvokeæ¹æ³é£æ ·å¯¹DLLä¸çæ¹æ³è¿è¡è°ç¨ãå½ç¶ä¸ç¨ä¸é¢æ¹æ³ä¹å¯ä»¥ï¼å¦ç¨æ¥å£å®ç°å¨æè°ç¨ï¼ä½DLLä¸å¿ é¡»æ该æ¥å£çå®ä¹å¹¶ä¸ç¨åºä¸ä¹è¦æ该æ¥å£çå®ä¹ï¼ä¹å¯ç¨åå°åéå®ç°å¨æè°ç¨[4]ãç°å¨æåªå¯¹åä¸é¢çInvokeæ¹æ³é£æ ·å¯¹DLLä¸çæ¹æ³è¿è¡è°ç¨è¿è¡è®¨è®ºï¼ä¸ºäºä»¥å使ç¨æ¹ä¾¿åå®ç°ä»£ç çå¤ç¨ï¼æ们å¯ä»¥ç»åä¸ä¸ä¸ªç¼åä¸ä¸ªç±»ã 1)       ldfsç±»çç¼åï¼ å¨é¡¹ç®âTzbâä¸æ°å»ºä¸ä¸ªå为ldfsçç±»ï¼æ为âload dll from resourceâï¼è¯·æ³¨æï¼å¨è¿ä¸ªç±»ä¸âresourceâä¸åªæ¯åµå ¥å¨EXEç¨åºä¸çèµæºï¼å®ä¹å¯ä»¥æ¯ç¡¬çä¸ä»»æä¸ä¸ªDLLæ件ï¼è¿æ¯å 为ldfsçç±»ä¸çæ¹æ³LoadDllæäºç¹å«ï¼å°±æ¯å ä»ç¨åºçå åµçèµæºä¸æ¥æ¾éå è½½çDLLï¼å¦ææ¾ä¸å°ï¼å°±æ¥æ¾ç¡¬çä¸çã é¦å å¯¼å ¥æéçå½å空é´ï¼
using System.IO; // 对æ件ç读åéè¦ç¨å°æ¤å½åç©ºé´ using System.Reflection; // ä½¿ç¨ Assembly ç±»éç¨æ¤å½åç©ºé´ using System.Reflection.Emit; // ä½¿ç¨ ILGenerator éç¨æ¤å½åç©ºé´ |
声æä¸éæåéMyAssemblyï¼
// è®°å½è¦å¯¼å ¥çç¨åºé static Assembly MyAssembly; |
æ·»å LoadDllæ¹æ³ï¼
private byte[] LoadDll(string lpFileName) { Assembly NowAssembly = Assembly.GetEntryAssembly(); Stream fs=null; try {// å°è¯è¯»åèµæºä¸ç DLL fs = NowAssembly.GetManifestResourceStream(NowAssembly.GetName().Name+"."+lpFileName); } finally {// å¦æèµæºæ²¡ææéç DLL ï¼å°±æ¥ç硬çä¸æ没æï¼æçè¯å°±è¯»å if (fs==null&&!File.Exists(lpFileName)) throw(new Exception(" æ¾ä¸å°æ件 :"+lpFileName)); else if(fs==null&&File.Exists(lpFileName)) { FileStream Fs = new FileStream(lpFileName, FileMode.Open); fs=(Stream)Fs; } } byte[] buffer = new byte[(int) fs.Length]; fs.Read(buffer, 0, buffer.Length); fs.Close(); return buffer; // 以 byte[] è¿å读å°ç DLL } |
æ·»å UnLoadDllæ¹æ³æ¥å¸è½½DLLï¼
public void UnLoadDll() {// 使 MyAssembly æ空 MyAssembly=null; } |
æ·»å Invokeæ¹æ³æ¥è¿è¡å¯¹DLLä¸æ¹æ³çè°ç¨ï¼å ¶åç大ä½ä¸åâForm1ï¼csâä¸çæ¹æ³Invokeç¸åï¼ä¸è¿è¿éç¨çæ¯âAssembly.Loadâï¼èä¸ç¨äºéæåéMyAssemblyæ¥ä¿åå·²å è½½çDLLï¼å¦æå·²å è½½çè¯å°±ä¸åå è½½ï¼å¦æè¿æ²¡å è½½æè å·²å è½½çä¸åç°å¨è¦å è½½çDLLå°±è¿è¡å è½½ï¼å ¶ä»£ç å¦ä¸æ示ï¼
public object Invoke(string lpFileName,string Namespace,string ClassName,string lpProcName,object[] ObjArray_Parameter) { try {// å¤æ MyAssembly æ¯å¦ä¸ºç©ºæ MyAssembly çå½å空é´ä¸çäºè¦è°ç¨æ¹æ³çå½å空é´ï¼å¦ææ¡ä»¶ä¸ºçï¼å°±ç¨ Assembly.Load å è½½æé DLL ä½ä¸ºç¨åºé if(MyAssembly==null||MyAssembly.GetName().Name!=Namespace) MyAssembly=Assembly.Load(LoadDll(lpFileName)); Type[] type=MyAssembly.GetTypes(); foreach(Type t in type) { if(t.Namespace==Namespace&&t.Name==ClassName) { MethodInfo m=t.GetMethod(lpProcName); if(m!=null) {// è°ç¨å¹¶è¿å object o=Activator.CreateInstance(t); return m.Invoke(o,ObjArray_Parameter); } else System.Windows.Forms.MessageBox.Show(" è£ è½½åºé !"); } } } catch(System.NullReferenceException e) { System.Windows.Forms.MessageBox.Show(e.Message); } return (object)0; } |
  2)       ldfsç±»ç使ç¨ï¼ 1ï¼Â æCsCount.dllä½ä¸ºâåµå ¥çèµæºâæ·»å å°é¡¹ç®âTzbâä¸ã 2ï¼Â åâForm1âçªä½ä¸æ·»å 两个æé®ï¼NameåTextå±æ§åå«ä¸ºâB7âãâldfs.Invokeè°ç¨countâï¼âB8âãâUnLoadDllâï¼å¹¶å°å®ä»¬è°æ´å°éå½å¤§å°åä½ç½®ã 3ï¼Â æå¼âForm1ï¼csâ代ç è§å¾ï¼æ·»å ä¸ä¸ªldfså®ä¾ï¼
// æ·»å ä¸ä¸ª ldfs å®ä¾ tmp private ldfs tmp=new ldfs(); |
4ï¼Â å¨âForm1ï¼cs[设计]âè§å¾ä¸åå»æé®B7ï¼å¨âB1_Clickâæ¹æ³ä½å æ·»å å¦ä¸ä»£ç ï¼
// è°ç¨ count(0), 并使ç¨ææ示æ¡æ¾ç¤ºå ¶è¿åå¼ MessageBox.Show(" è¿æ¯æ¨ç¬¬ "+tmp.Invoke("CsCount.dll","CsCount","Class1","count",new object[]{(int)0}).ToString()+" 次ç¹å»æ¤æé®ã "," æææ¯ "); |
5ï¼Â å¨âForm1ï¼cs[设计]âè§å¾ä¸åå»æé®B7ï¼å¨âB1_Clickâæ¹æ³ä½å æ·»å å¦ä¸ä»£ç ï¼
// å¸è½½ DLL tmp.UnLoadDll(); |
6ï¼Â âF5âè¿è¡è¯¥ç¨åºï¼å¹¶å ç¹å»æé®B7ä¸æ¬¡ï¼æ¥çç¹å»æé®B8ï¼æååç¹å»æé®B7ï¼æ¤æ¶åç°åå¼å§éæ°è®¡æ°äºï¼æ åµåâdldç±»ç使ç¨â类似ï¼ä¹å°±æ¯ä¹å®ç°äºDLLçå¨æè£ è½½ä¸å¸è½½äºã    说æï¼ä»¥ä¸æç¨å°çæææºä»£ç 详è§é件1:Form1.csãé件2:dld.csãé件3:ldfs.csãé件4:Count.cppãé件5:Class1.csã  ä¸ã     ç»è®º 使ç¨DLLæå¾å¤ä¼ç¹ï¼å¦ï¼èçå åååå°äº¤æ¢æä½ï¼å¼å大åç¨åºæ¶å¯ä»¥ææäºæ¨¡ååé ç»ç¨åºåï¼ç¨åºåå¯ä»¥ç¨ä»»ä½ä¸é¨ä»æçæçè¯è¨æ该模åç¼è¯æDLLæ件ï¼è¿æ ·å¯ä»¥æé«ä»£ç çå¤ç¨ï¼å¤§å¤§åè½»ç¨åºåçå·¥ä½éãå½ç¶DLLä¹æä¸äºä¸è¶³ï¼å¦å¨æè¦ä¸æåçé®é¢ãæ以ï¼å¦ä½çµæ´»å°è°ç¨DLLåºè¯¥æ¯æ¯ä½ç¨åºåæçç¥çã C# è¯è¨æå¾å¤ä¼ç¹ï¼è¶æ¥è¶å¤ç人å¼å§ä½¿ç¨å®æ¥ç¼ç¨ãä½æ¯ï¼C#è¿æä¸äºä¸è¶³ï¼å¦å¯¹ä¸å°çåºå±æä½æ¯æ è½ä¸ºåçï¼åªè½éè¿è°ç¨Win32 DLL æC++çç¼åçDLLï¼å¦å¤ï¼ä¸è¬è®¤ä¸ºC#ç¨åºçä¿å¯æ§ä¸å¤å¼ºï¼å 为å®å®¹æ被Reflector åç¼è¯èå¾å°é¨åæºç ï¼æ以éè¦ä½¿ç¨æ··åç¼ç¨å 强C#ç¨åºçä¿å¯æ§ï¼èæDLLåµå ¥C#ç¨åºå¹¶å®ç°å¨æè°ç¨çæ¹æ³æ¯æ¯è¾çæ³çæ¹æ³ï¼å 为å¯ä»¥æDLLæ件å ç¨æä¸ç®æ³è¿è¡å å¯çè³å缩ååä½ä¸ºèµæºæ件添å å°C#ç¨åºä¸ï¼å¨ç¨åºè¿è¡æ¶æç¨æä¸ç®æ³è¿è¡è§£å解å¯åæè¿è¡å è½½ï¼æ以å³ä½¿ç¨åç¼è¯è½¯ä»¶ï¼ä¹åªè½å¾å°ä¸ä¸ªèµæºæ件ï¼ä¸è¿ä¸ªèµæºæ件æ¯ç¨ä¸ä¸ªå¤æç®æ³è¿è¡å å¯è¿çï¼ä¸å¯è½å次对èµæºæ件ä¸çå 容è¿è¡åç¼è¯ï¼ä»è大大å 强äºä»£ç çä¿å¯æ§ã   åèæç®ï¼ [1] å¼èªï¼ãä»ä¹æ¯ DLL?ãï¼ç½åï¼ http://support.microsoft.com/default.aspx?scid=kb;zh-cn;815065 [2] ãå¨ C# ä¸éè¿ P/Invoke è°ç¨Win32 DLLã Jason Clark ï¼ ç½åï¼http://www.microsoft.com/china/msdn/library/langtool/vcsharp/ousNET.mspx [3] ãæ·±å ¥åæWindowsåLinuxå¨æåºåºç¨å¼åãåä¸æ æ¨æï¼ ç½åï¼http://tech.ccidnet.com/art/302/20050919/336005_1.html [4] ãC# ç¨åºè®¾è®¡ã Jesse Liberty è ååºè¯ è¯,ä¸å½çµååºç社 posted on 2006-02-27 10:17 Cdo é 读(3581) è¯è®º(1)  ç¼è¾Â æ¶è å¼ç¨ ç½æ æå±åç±»: .NET Â