å¨æé¾æ¥åºï¼ä¹ç§°ä¸º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çæ¹æ³é½ä¸å°½ç¸åï¼å¨æ¤åªå¯¹ç¨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ï¼ä¾¿å¼¹åºå¦ä¸æ示æ¡ï¼
7.代ç å¦ä¸ï¼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
[DllImport("user32.dll", EntryPoint = "MessageBoxA")]
static extern int MsgBox2(int hWnd, string msg, string caption, int type);
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
MsgBox2(0, " è¿å°±æ¯ç¨ DllImport è°ç¨ DLL å¼¹åºçæ示æ¡å¦ï¼ ", " æææ¯ ", 0x30);
}
private void button2_Click(object sender, EventArgs e)
{
MsgBox2(0, " è¿å°±æ¯ç¨ DllImport è°ç¨ DLL å¼¹åºçæ示æ¡å¦222222fï¼ ", " 222222 ", 0x30);
}
}
}
(äº)    å¨æè£ è½½ãè°ç¨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âçbinDebugæ件夹ä¸ï¼æâ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;
}
Â
Â
使ç¨cscå½ä»¤å°.csæ件ç¼è¯æ.dllçè¿ç¨ å¾å¤æ¶å,æ们éè¦å°.csæ件åç¬ç¼è¯æ.dllæ件, æä½å¦ä¸: æå¼å½ä»¤çªå£->è¾å ¥cmdå°æ§å¶å°->cd C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 转å°vs.netå®è£ ç该ç®å½ä¸->æ§è¡cscå½ä»¤csc /target:library File.cs->å¨è¯¥ç®å½ä¸äº§çä¸ä¸ªå¯¹åºååç.dllæ件(åæ:æ.csæ件æ¾å°C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322ç®å½ä¸) cscå½ä»¤çæ¹å¼å¾å¤,请åèä»¥ä¸ è¯ File.cs 以产ç File.exe csc File.cs ç¼è¯ File.cs 以产ç File.dll csc /target:library File.cs ç¼è¯ File.cs 并å建 My.exe csc /out:My.exe File.cs éè¿ä½¿ç¨ä¼ååå®ä¹ DEBUG 符å·ï¼ç¼è¯å½åç®å½ä¸ææç C# æ件ãè¾åºä¸º File2.exe csc /define:DEBUG /optimize /out:File2.exe *.cs ç¼è¯å½åç®å½ä¸ææç C# æ件ï¼ä»¥äº§ç File2.dll çè°è¯çæ¬ãä¸æ¾ç¤ºä»»ä½å¾½æ åè¦å csc /target:library /out:File2.dll /warn:0 /nologo /debug *.cs å°å½åç®å½ä¸ææç C# æ件ç¼è¯ä¸º Something.xyzï¼ä¸ä¸ª DLLï¼ csc /target:library /out:Something.xyz *.cs ç¼è¯ File.cs 以产ç File.dll csc /target:library File.csè¿ä¸ªå°±æ¯æ们使ç¨æå¤çä¸ä¸ªå½ä»¤ï¼å ¶å®å¯ä»¥ç®åçåæcsc /t:library File.csï¼å¦å¤çä¸ä¸ªåæ³æ¯ csc /out:mycodebehind.dll /t:library mycodebehind.csï¼è¿ä¸ªå¯ä»¥èªå·±æå®è¾åºçæ件åã csc /out:mycodebehind.dll /t:library mycodebehind.cs mycodebehind2.csï¼è¿ä¸ªçä½ç¨æ¯æ两个csæä»¶è£ å°ä¸ä¸ª.dllæ件é 举ä¾(æäºç½ç») ä¸ã å¨æé¾æ¥åº         ä»ä¹æ¯å¨æé¾æ¥åºï¼DLLä¸ä¸ªåæ¯å¯¹äºä½ æ¥è¯´ä¸å®å¾çæå§ï¼å®æ¯Dynamic Link Library ç缩åå½¢å¼ï¼å¨æé¾æ¥åº (DLL) æ¯ä½ä¸ºå ±äº«å½æ°åºçå¯æ§è¡æ件ãå¨æé¾æ¥æä¾äºä¸ç§æ¹æ³ï¼ä½¿è¿ç¨å¯ä»¥è°ç¨ä¸å±äºå ¶å¯æ§è¡ä»£ç çå½æ°ãå½æ°çå¯æ§è¡ä»£ç ä½äºä¸ä¸ª DLL ä¸ï¼è¯¥ DLL å å«ä¸ä¸ªæå¤ä¸ªå·²è¢«ç¼è¯ãé¾æ¥å¹¶ä¸ä½¿ç¨å®ä»¬çè¿ç¨åå¼åå¨çå½æ°ãDLL è¿æå©äºå ±äº«æ°æ®åèµæºãå¤ä¸ªåºç¨ç¨åºå¯åæ¶è®¿é®å åä¸å个 DLL å¯æ¬çå 容ã ããå大å¤æ°ç¨åºåä¸æ ·ï¼ä½ ä¸å®å¾ä½¿ç¨è¿DLLå§ãä¹æ¾æåå°å®ç带ç»ä½ ç¨åºè®¾è®¡åç¼ç ä¸ç好éå§ä»å¤©ææ³å大家æ¢è®¨ä¸ä¸ªä¸»é¢ï¼å¦ä½å¨C#å建åè°ç¨DLL(å¨æé¾æ¥åº), å ¶å®å¨å¾å¤§æä¹ä¸è讲ï¼DLL让ææ´çµæ´»çç»ç»ç¼åæ们çåºç¨ç¨åºï¼ä½ä¸ºè½¯ä»¶è®¾è®¡è ï¼å¯ä¸ä¸ªæ ¹æ®å®æ¥è¾¾å°å¾é«ç代ç éç¨ææãä¸é¢ææ¥ä»ç»ä¸ä¸å¨C#ä¸å¦ä½å建åè°ç¨DLLã äºãåå¤å·¥ä½ ããæ们éè¦å¯¹æ们æ¥ä¸æ¥è¦åçäºæ å个ç®åçä»ç»ï¼å¨æ¬ææ们å°å©ç¨C#è¯è¨å建ä¸ä¸ªå为 MyDLL.DLLçå¨æé¾æ¥åºï¼å¨è¿ä¸ªå¨æé¾æ¥åºæ件ä¸æ们å°æä¾ä¸¤ä¸ªåè½ä¸ä¸ªæ¯å¯¹ä¸¤ä¸ªåæ°äº¤æ¢ä»ä»¬çå¼ï¼å¦ä¸ä¸ªåè½æ¯æ±ä¸¤ä¸ªåæ°çæå¤§å ¬çº¦æ°ãç¶åå建ä¸ä¸ªåºç¨ç¨åºä½¿ç¨è¿ä¸ªDLLãè¿è¡å¹¶è¾åºç»æã ä¸ãå建DLL 让æ们å建以ä¸ä¸ä¸ªC#代ç æä»¶ï¼ 1ã MySwap.cs } using System; namespace MyMethods {      public class SwapClass      {           public static bool Swap(ref long i,ref long j)           {                i = i+j;                j = i-j;                i = i-j;                return true;            }        } } 2ãMyMaxCD.cs using System; namespace MyMethods {      public class MaxCDClass      {           public static long MaxCD(long i, long j)           {                long a,b,temp;                if(i>j)                {                     a = i;                     b = j;                }                else                {                     b = i;                     a = j;                }                temp = a % b;                while(temp!=0)                {                     a = b;                     b = temp;                     temp = a % b;                }                return b;             }        } } ãéè¦æ³¨æçæ¯ï¼æ们å¨å¶ä½è¿ä¸¤ä¸ªæ件çæ¶åå¯ä»¥ç¨Visual Studio.NETæè å ¶ä»çææ¬ç¼è¾å¨ï¼å°±ç®æ¯è®°äºæ¬ä¹å¯ä»¥ãè¿ä¸¤ä¸ªæ件è½ç¶ä¸å¨åä¸ä¸ªæ件éé¢ï¼ä½æ¯ä»ä»¬æ¯å±äºåä¸ä¸ªnamespaceï¼å称空é´ï¼è¿å¯¹ä»¥åæ们使ç¨è¿ä¸¤ä¸ªæ¹æ³æä¾äºæ¹ä¾¿ãå½ç¶ä»ä»¬ä¹å¯ä»¥å±äºä¸åçå称空é´ï¼è¿æ¯å®å ¨å¯ä»¥çï¼ä½åªæ¯å¨æ们åºç¨ä»ä»¬çæ¶åå°±éè¦å¼ç¨ä¸¤ä¸ªä¸åçå称空é´ï¼æ以ä½è 建议è¿æ¯åå¨ä¸ä¸ªå称空é´ä¸é¢æ¯è¾å¥½ã ããæ¥ä¸æ¥çä»»å¡æ¯æè¿ä¸¤ä¸ªcsæ件åææ们éè¦çDLLæ件ãæ¹æ³æ¯è¿æ ·çï¼å¨å®è£ äºMicrosoft.NET Frameworkçæä½ç³»ç»ä¸ï¼æ们å¯ä»¥å¨Windowsæå¨ç®å½ä¸æ¾å°Microsoft.NETç®å½ãå¨è¿ä¸ªç®å½ä¸é¢æä¾äºC#çç¼è¯å¨ï¼CSC.EXEè¿è¡ï¼csc /target:library /out:MyDLL.DLL MySwap.cs MyMaxCD.csï¼å®æåå¯å¨æ¬ç®å½ä¸é¢æ¾å°æ们åæçæçMyDLL.DLLæ件/target:library ç¼è¯å¨é项éç¥ç¼è¯å¨è¾åº DLL æ件èä¸æ¯ EXE æ件ãåè·æ件åç /out ç¼è¯å¨é项ç¨äºæå® DLL æ件åãå¦æ/outåé¢ä¸è·æ件åç¼è¯å¨ä½¿ç¨ç¬¬ä¸ä¸ªæ件 (MySwap.cs) ä½ä¸º DLL æ件åãçæçæ件为MySwap.DLLæ件ã ããOK!æ们å建å¨æé¾æ¥åºæ件çä»»å¡å®æäºï¼ç°å¨æ¯æ们享åå³å¨ææçæ¶åäºï¼ä¸é¢æå°ä»ç»å¦ä½ä½¿ç¨æ们æå建çå¨æé¾æ¥åºæ件ã   åã使ç¨DLL   æ们ç®ååä¸ä¸ªå°ç¨åºæ¥æµè¯ä¸ä¸æ们åæåç两个æ¹æ³æ¯å¦æ£ç¡®ï¼å¥½å§ï¼è·ææ¥ï¼ MyClient.cs using System; using MyMethods; //è¿éæ们å¼ç¨åæå®ä¹çå称空é´ï¼å¦æåæç两个æ件æ们åå¨ä¸¤ä¸ªä¸åçåç§°ç©ºé´ class MyClient {      public static void Main(string[] args)      {          if (args.Length != 2)          {               Console.WriteLine("Usage: MyClient <num1> <num2>");               return;          }           long num1 = long.Parse(args[0]);           long num2 = long.Parse(args[1]);           SwapClass.Swap(ref num1,ref num2); ãã // 请注æï¼æ件å¼å¤´ç using æ令使æ¨å¾ä»¥å¨ç¼è¯æ¶ä½¿ç¨æªéå®çç±»åæ¥å¼ç¨ DLL æ¹æ³           Console.WriteLine("The result of swap is num1 = {0} and num2 ={1}",num1, num2);           long maxcd = MaxCDClass.MaxCD(num1,num2);           Console.WriteLine("The MaxCD of {0} and {1} is {2}",num1, num2, maxcd);      } } è¥è¦çæå¯æ§è¡æ件 MyClient.exeï¼è¯·ä½¿ç¨ä»¥ä¸å½ä»¤è¡ï¼ csc /out:MyClient.exe /reference:MyDLL.DLL MyClient.cs /out ç¼è¯å¨é项éç¥ç¼è¯å¨è¾åº EXE æ件并ä¸æå®è¾åºæ件å (MyClient.exe)ã/reference ç¼è¯å¨é项æå®è¯¥ç¨åºæå¼ç¨ç DLL æ件ã äºãæ§è¡ è¥è¦è¿è¡ç¨åºï¼è¯·è¾å ¥ EXE æ件çå称ï¼æ件åçåé¢è·ä¸¤ä¸ªæ°åï¼ä¾å¦ï¼MyClient 123 456 å ãè¾åº The result of swap is num1 = 456 and num2 = 123 The MaxCD of 456 and 123 is 3 ä¸ãå°ç» å¨æé¾æ¥å ·æä¸åä¼ç¹ï¼ ããï¼ãèçå åååå°äº¤æ¢æä½ãå¾å¤è¿ç¨å¯ä»¥åæ¶ä½¿ç¨ä¸ä¸ª DLLï¼å¨å åä¸å ±äº«è¯¥ DLL çä¸ä¸ªå¯æ¬ãç¸åï¼å¯¹äºæ¯ä¸ªç¨éæé¾æ¥åºçæçåºç¨ç¨åºï¼Windows å¿ é¡»å¨å åä¸å è½½åºä»£ç çä¸ä¸ªå¯æ¬ã ããï¼ãèçç£ç空é´ã许å¤åºç¨ç¨åºå¯å¨ç£çä¸å ±äº« DLL çä¸ä¸ªå¯æ¬ãç¸åï¼æ¯ä¸ªç¨éæé¾æ¥åºçæçåºç¨ç¨åºåå ·æä½ä¸ºåç¬çå¯æ¬é¾æ¥å°å ¶å¯æ§è¡å¾åä¸çåºä»£ç ã ããããï¼ãåçº§å° DLL æ´ä¸ºå®¹æãDLL ä¸çå½æ°æ´æ¹æ¶ï¼åªè¦å½æ°çåæ°åè¿åå¼æ²¡ææ´æ¹ï¼å°±ä¸ééæ°ç¼è¯æéæ°é¾æ¥ä½¿ç¨å®ä»¬çåºç¨ç¨åºãç¸åï¼éæé¾æ¥ç对象代ç è¦æ±å¨å½æ°æ´æ¹æ¶éæ°é¾æ¥åºç¨ç¨åºã ããï¼ãæä¾å®åæ¯æãä¾å¦ï¼å¯ä¿®æ¹æ¾ç¤ºå¨é©±å¨ç¨åº DLL 以æ¯æå½å交ä»åºç¨ç¨åºæ¶ä¸å¯ç¨çæ¾ç¤ºå¨ã ããï¼ãæ¯æå¤è¯è¨ç¨åºãåªè¦ç¨åºéµå¾ªå½æ°çè°ç¨çº¦å®ï¼ç¨ä¸åç¼ç¨è¯è¨ç¼åçç¨åºå°±å¯ä»¥è°ç¨ç¸åç DLL å½æ°ãç¨åºä¸ DLL å½æ°å¨ä¸åæ¹é¢å¿ é¡»æ¯å ¼å®¹çï¼å½æ°ææå ¶åæ°è¢«æ¨éå°å æ ä¸ç顺åºï¼æ¯å½æ°è¿æ¯åºç¨ç¨åºè´è´£æ¸ çå æ ï¼ä»¥åå¯åå¨ä¸æ¯å¦ä¼ éäºä»»ä½åæ°ã ããï¼ãæä¾äºæ©å± MFC åºç±»çæºå¶ãå¯ä»¥ä»ç°æ MFC 类派çç±»ï¼å¹¶å°å®ä»¬æ¾å° MFC æ©å± DLL ä¸ä¾ MFC åºç¨ç¨åºä½¿ç¨ã ããï¼ã使å½é çæ¬çå建轻æ¾å®æãéè¿å°èµæºæ¾å° DLL ä¸ï¼å建åºç¨ç¨åºçå½é çæ¬åå¾å®¹æå¾å¤ãå¯å°ç¨äºåºç¨ç¨åºçæ¯ä¸ªè¯è¨çæ¬çå符串æ¾å°åç¬ç DLL èµæºæ件ä¸ï¼å¹¶ä½¿ä¸åçè¯è¨çæ¬å è½½åéçèµæºã ããä½¿ç¨ DLL çä¸ä¸ªæ½å¨ç¼ºç¹æ¯åºç¨ç¨åºä¸æ¯ç¬ç«çï¼å®åå³äºæ¯å¦åå¨åç¬ç DLL 模åã |