æ¬æåºèª âä¸æ³¨C#ã.NETâ å客ï¼è¯·å¡å¿ ä¿çæ¤åºå¤http://wangqingpei557.blog.51cto.com/1009349/595015
Â
Â
.NETç®è°äºæä½(ä¸ï¼å¼ç¯ä»ç»)
äºæä½ç³»åæç« :
.NETç®è°äºæä½(ä¸ï¼å¼ç¯ä»ç»)
.NETç®è°äºæä½(äºï¼å ç¹ä¸ºå¿«)
.NETç®è°äºæä½(ä¸ï¼åºç¡ç¥è¯ä¹DllImportç¹æ§)
.NETç®è°äºæä½(åï¼åºç¡ç¥è¯ä¹Disposeéæ管å å)
.NETç®è°äºæä½(äºï¼åºç¡ç¥è¯ä¹Dynamicå¹³å°è°ç¨)
.NETç®è°äºæä½(å ï¼åºç¡ç¥è¯ä¹æåå¹³å°è°ç¨æ§è½)
.NETç®è°äºæä½(ä¸ï¼æ°æ®å°éä¹ä»ç»)
æ¬äººæè¿å¨å¦ä¹ éæ管C++äºæä½çææ¯ï¼æç¹å°æ¶è·ä¸æ¢ç§èæ¿åºæ¥è·å¤§å®¶å享ï¼ä½ä¸º.NETå¼å人åï¼æ们æå¿ è¦å¦ä¹ ä¸äºäºæä½æ¹é¢çç¥è¯ï¼å°¤å ¶å¯¹ä¸äºé«çº§ç¨åºåæ¥è¯´ï¼ææ¡éæ管çäºæä½è½å¾å¥½çå¢å æ们çææ¯ç«äºåï¼ç±äºäºæä½çå 容å¾å¤ï¼ææç®ç¨ç³»åæ¥è®²ï¼è¿ç¯å°±å½æ¯é便å å¨åå ¥é¨ä»ç»å§ï¼
.NETå¹³å°çç¸å ³åºç¡ç¥è¯æå°±ä¸æµªè´¹æ¶é´è®²äºï¼ç´æ¥è¿å ¥ä¸»é¢å§ï¼.NETæ¯å¨æä½ç³»ç»ä¸çä¸å±è½¯ä»¶å¼åæ¡æ¶ï¼æ¯å¨Windowså¹³å°ä¸çæ½è±¡å°è£ ï¼å°å¤æç软件å¼åè¿ç¨ç®ååï¼è®©æ们æè±å¤æéå¤çææ¯é¾ç¹è¿è¡é«æçåºç¨ç³»ç»å¼åï¼ä½æ¯å¨å·¥ä½è¿ç¨ä¸æ们ç»å¸¸ä¼éå°ä¸äºè°ç¨Win32çç¸å ³æä½ï¼æ¯å¦è·ç¨æ·çé¢ç¸å ³çæ¥å£è°ç¨User32.dllæ¡æ¶ï¼ä¸äºå æ ¸å¤çKernel.dllæ¡æ¶ï¼è¿äºé½æ¯å¹³å°æä¾ç»æ们çæ¥å£ï¼è¦æ³è½¯ä»¶å¨è®¡ç®æºä¸è¿è¡èµ·æ¥ï¼ä¸ç®¡å¤å°å±å°è£ ãå¤å°å±æ½è±¡æç»è¿æ¯è¦å°æ们ç¼åç代ç 转æ¢ææºå¨ç æè½æåè¿è¡è½¯ä»¶ï¼åªæ¯åè½»äºæ们ç¨åºåçå·¥ä½éï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
1ï¼
ç±äº.NETåºç¨ç¨åºæ¯æ管çï¼è¿è¡å¨åéçCLRç¯å¢ä¸ï¼ææçå ååé åæ¶ççé½æ¯CLRè´è´£ç®¡çï¼è¿æ ·æ¢æ好å¤ä¹æåå¤ï¼æ们æ æ³ç¨ç¨åºæ¥ä¸ºæ欲为ï¼åªè½ç¨.NETæä¾ç»æ们çåè½æ¥ç¼åï¼å¨æ²¡æP/Invoke(å¹³å°è°ç¨)çæ åµä¸ï¼æ们è½åçäºæ ççå¾å¥½ï¼å¾®è½¯ä¹èèå°å¦æ.NETä¸æä¾å¯¹è¿å»çWindowså¹³å°ä¸ææ¯çæ¯æï¼å¿ ç¶å°å¤§å¤§å¦¨ç¢.NETææ¯çåå±ï¼å¯¹äºä¸äºæççææ¯å¦ï¼COM(ç»ä»¶å¯¹è±¡æ¨¡å)ãOLE(å¤åææ¡£)ãç¨æ·çé¢(User32)ãå å管ç(Kernel)ççé½æä¾äºå¾å¥½çæ¯æï¼èä¸ç¸å½ç®åï¼æ们è½å¾æ¹ä¾¿çè¿è¡è°ç¨éæ管ææ¯ï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
è¦æ³å¾å¥½çå©ç¨P/Invoke(å¹³å°è°ç¨)è¿è¡äºæä½ï¼æ们ä¸ååè¦æ.NETå¹³å°çç¸å ³ææ¯ï¼æ们ä¹éè¦å¯¹éæ管çææ¯æ个ç®åçäºè§£ï¼æ¯å¦C++ä¸çåéçå åå ç¨åéæ管çå åå ç¨å¤§å°åºå«ãC++ä¸çå符ç¼ç ä¸.NETä¸çå符ç¼ç åºå«ï¼ä»»ä½ä¸¤ç§ä¸åææ¯ä¹é´çåºå«ä¸ä» ä» æ¯æ们表é¢çä¸å»çé£äºä¸è¥¿ï¼æ´éè¦çå¨äºå®çè¿è¡ä¸å ååé ï¼å¨æ们å¦ä¹ å¹³å°è°ç¨çæ¶åï¼æ们éè¦è±ä¸ä¸ç¹æ¶é´å»å¦ä¹ ä¸äºéæ管ææ¯ï¼æ¯å¦COMçå ååé æ¹æ³CoTaskMemAllocï¼C++çå ååé NEWï¼Cçå ååé mallocï¼è¿äºåé æ¹æ³çä¸å导è´æ管çå°éææ¶å¨çå¤çä¸åï¼è¿è¡äºæä½çæ¶åï¼æ´å¤éè¦èèçæ¯ä¸¤è ä¹é´ççä»·å¤çï¼å¦åéçå å大å°å¸å±æ¯å¦ä¸è´ï¼å¨æ管ä¸è°ç¨éæ管代ç è¿åä¸ä¸ªæéç±»åï¼æ们ç¨IntPtræ¥åï¼ç¶åç¨MarShalå°éææ¶å¨ç帮å©ç±»ï¼æ¥è¿è¡å¯¹è±¡è½¬æ¢ï¼æ讲çè¿äºåªæ¯äºæä½ä¸çå°å±±ä¸è§ï¼å½æ们è½çç»è¿è¡å¹³å°è°ç¨çæ¶åæ们æå¼åç软件类åå°å¤§å¤§å¢å ï¼ä¸ååæ¯Winformåasp.netä¹ç±»çï¼æ们ä¹å¯ä»¥ç¨.NETæ¥å¼åä¸äºå¤§åçç½ç»ç³»ç»ï¼æ´éè¦çæ¯æ们å¯ä»¥ç¨.NETæ¥å¼åä¸äºé¨å.NETç¨åºåæèå´æ¥ç软件ï¼åæ ·æ¯.NETç¨åºåï¼è¿æ ·ä¸æ¥æ们就æ¯åè¡å¤äºä¸äºç¹ç ï¼
æ»ç»ï¼è¿ç¯ä¸»è¦æ¯ç®åä»ç»äºæä½è¦æ¶åçç¥è¯é¢ï¼å¯è½æè¿çççå å¥è¯å¾é¾è¯´æ¸ æ¥äºæä½çä¸äºææ¯é®é¢ï¼ä¸è¦æ¥ï¼è¯·ç»§ç»å ³æ³¨æ¬äººï¼ä¸é¢æ们å°å ·ä½ä»ç»äºæä½ä¸çå®è´¨æ§çææ¯æä½ï¼
.NETç®è°äºæä½(äºï¼å ç¹ä¸ºå¿«)
äºæä½ç³»åæç« :
.NETç®è°äºæä½(ä¸ï¼å¼ç¯ä»ç»)
.NETç®è°äºæä½(äºï¼å ç¹ä¸ºå¿«)
.NETç®è°äºæä½(ä¸ï¼åºç¡ç¥è¯ä¹DllImportç¹æ§)
.NETç®è°äºæä½(åï¼åºç¡ç¥è¯ä¹Disposeéæ管å å)
.NETç®è°äºæä½(äºï¼åºç¡ç¥è¯ä¹Dynamicå¹³å°è°ç¨)
.NETç®è°äºæä½(å ï¼åºç¡ç¥è¯ä¹æåå¹³å°è°ç¨æ§è½)
.NETç®è°äºæä½(ä¸ï¼æ°æ®å°éä¹ä»ç»)
æ们继ç».NETäºæä½å¦ä¹ ï¼ä¸ºäºæå¼äºæä½çç¥ç§é¢çº±ï¼ä»å¤©è¿ç¯æç« æ们就æ¥å ç¹ä¸ºå¿«ï¼è®©æ们å æ¥å个ä¾åï¼åºç¡çä¸è¥¿ï¼æ们éç»è¿è¡è®²è§£ï¼ç±äºäºæä½çµæ¯å°çä¸è¥¿é常å¤ï¼æ¯è¾å¤æï¼æ们è¦å¾ªç¯æ¸è¿çå¦ä¹ ï¼ä¸ºäºç»å¤§å®¶æä¸å®çå¸å¼åï¼è®©æ们ä¸è¾¹çä¸è¾¹è½å¨æåèµ·æ¥ï¼æ¬ç¯æç« ç¨VisualStudio2010è¿è¡æ¼ç¤ºï¼å°éæ管代ç æ´é²å¨æ们ç¼åï¼å®å¯¹æ们æ¥è¯´ä¸å¨æç¥ç§æï¼æ们éè¿.NETP/invoke(å¹³å°è°ç¨)å¾æ¹ä¾¿çè¿è¡è°ç¨ï¼å¯è½éè¦æ们ææ¡ä¸äºC++çåºç¡ç¥è¯ï¼ä½æ¯ä¹æ¾å¿å¦ï¼æCè¯è¨çåºç¡åï¼è¶³å¤ç¨äºï¼æ们å¼å§å§ï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
è¦æ³æåè°ç¨éæ管代ç æ们éè¦ä¸äºåå¤å·¥ä½ï¼
1.éè¦ç¥ééæ管DLLæ件æåªäºå¯¼åºå½æ°æ¯å¯ä»¥è°ç¨çï¼ç±äºå¯¼åºå½æ°çæ¹æ³çå称被éæ°æ´é¡¿è¿äºæ¯å¦ä¸ä¸ªæ¹æ³add(int number)ï¼æ´é¡¿å为[email protected]ï¼ä¸ºä»ä¹ä¼è¿æ ·æ们åé¢è¿è¡è®²è§£ï¼è¿è·C++è¯æ³æç¹çµè¿ï¼è¿éå°±ä¸æ¯äºï¼
2.å¨æ管代ç ä¸å®ä¹éæ管å½æ°çç³æï¼ä¹å°±æ¯æ们.NETå¹³å°éçDLLImportç¹æ§ï¼è¯¥å¯¹è±¡æ¯æ管平å°è¿è¡å¹³å°è°ç¨çæ ¸å¿å¯¹è±¡ï¼ç¨å®.NETå¼æå°±ç¥é该æ¹æ³æ¯å¨å¤é¨å®ä¹çï¼
3.ç¨æ管代ç è¿è¡è°ç¨éæ管æ¹æ³ï¼
ä¸é¢æ们就å¼å§ç¨VisualStudio2010è¿è¡æ¼ç¤ºï¼æ们ç¨Vs2010å建ä¸ä¸ªè§£å³æ¹æ¡ï¼éé¢å æ¬æ管ä¸éæ管两个项ç®ï¼æç»åºéæ管代ç çå建å¾ï¼
1ï¼
éæ©VisualC++â>Win32â>Win32项ç®ï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
2ï¼
è¿æ ·æ们就å建äºéæ管C++çå¼åç¯å¢ï¼ä¸é¢æ们æ¥ç¼åC++ç代ç ï¼ææ¿æèªå·±äºå å建好ç项ç®åæ¼ç¤ºï¼
3ï¼
æçéæ管项ç®æ¯Win32DLLï¼å建好åä¼æä¸ä¸ªå项ç®å称ä¸æ ·ç.cppæ件ï¼è¿ä¸ªæ¯æºä»£ç æ件ï¼æ们åªéè¦å¨éé¢åç¹éæ管æä½ç代ç å°±è¡äºï¼
// Win32DLL.cpp : å®ä¹ DLL åºç¨ç¨åºç导åºå½æ°ã
//
#include"stdafx.h"
extern"C" _declspec(dllexport) int _stdcall add(int x,int y)
{
return x+y;
}
å¨æ件Win32DLL.cppæ件éé¢æç¼åäºä¸ä¸ªaddæ¹æ³ï¼ä» ä» ä½ä¸ºæ¼ç¤ºä½¿ç¨ï¼æä¸æ们ä¸ç®¡ä»çå ·ä½è¯æ³ï¼åæ¢å°æ管代ç ä¸ï¼æç代ç å¦ä¸ï¼
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespaceCSharp.Interop
{
public static class InteropClass
{
[DllImport("Win32DLL.dll", EntryPoint = "add", CharSet =CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern int AddNumber(int x, int y);
}
}
è¿æ ·æ们就å¯ä»¥ç´æ¥è°ç¨AddNumberæ¹æ³è¿è¡è°ç¨äºï¼
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;
namespace CSharp
{
class Test1
{
static void Main(string[] args)
{
try
{
int count = Interop.InteropClass.AddNumber(10, 20);
Console.Write(count);
}
catch (DllNotFoundException errnot) { }
catch (EntryPointNotFoundException errpoint) { }
}
}
}
æ»ç»ï¼æ¬ç¯æç« çéç¹æ¯æ³è®©å¤§å®¶çä¸ä¸æ管ä¸éæ管çæ´ä¸ªçå½å¨ææ¯æä¹æ¥çï¼å¯¹æ管éæ管ç代ç ä¹é´çåè°æ个èªå·±çæè·¯ï¼åé¢å°è¯¦ç»ç说æäºæä½ä¸æ¶åçç»èï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
æ¬æåºèª âä¸æ³¨C#ã.NETâ å客ï¼è¯·å¡å¿ ä¿çæ¤åºå¤http://wangqingpei557.blog.51cto.com/1009349/595559
Â
.NETç®è°äºæä½(ä¸ï¼åºç¡ç¥è¯ä¹DllImportç¹æ§)
äºæä½ç³»åæç« :
.NETç®è°äºæä½(ä¸ï¼å¼ç¯ä»ç»)
.NETç®è°äºæä½(äºï¼å ç¹ä¸ºå¿«)
.NETç®è°äºæä½(ä¸ï¼åºç¡ç¥è¯ä¹DllImportç¹æ§)
.NETç®è°äºæä½(åï¼åºç¡ç¥è¯ä¹Disposeéæ管å å)
.NETç®è°äºæä½(äºï¼åºç¡ç¥è¯ä¹Dynamicå¹³å°è°ç¨)
.NETç®è°äºæä½(å ï¼åºç¡ç¥è¯ä¹æåå¹³å°è°ç¨æ§è½)
.NETç®è°äºæä½(ä¸ï¼æ°æ®å°éä¹ä»ç»)
æ们继ç».NETäºæä½å¦ä¹ ï¼ä¸ä¸ç¯æç« ä¸æ们ä»ç»äºæ管代ç æä¹ä¸éæ管代ç C++ä¹é´çäºæä½ï¼è¦æ³å¨æ管代ç ä¸æåçè¿è¡éæ管è°ç¨ï¼è¦æ³¨æçç»èè¿æ¯å¾å¤çï¼ä¸é¢æ们就æ¥ä»ç»ä¸ä¸ï¼å¨äºæä½æ¹é¢æ管代ç è¦æ³¨æçå¿ ä¸å¯å°ç代ç ç³æï¼ä¸ºæ们ä¸é¢çäºæä½æä¸åºç¡ï¼
å¨.NETå¹³å°éé¢å¼åæ们è¿æ¯å¾å¹¸è¿çï¼å¾®è½¯ä¸ºæ们åäºå¾å¤å¾æ¹ä¾¿çä¸è¥¿ï¼æ们åªéè¦äºè§£ä¸ä¸å°±è½å¿«éä¸æï¼å¨äºæä½éé¢æ们åªéè¦åå©DllImportç¹æ§å°±è½å¾å¥½çåå ¥å°éæ管代ç ä¸ï¼å¾®è½¯ä¸ºæ们å¤çäºå¤æçå ååé ãå¨æå½æ°æ¥æ¾ãå°å解æççæ¬åºè¯¥æ们èªå·±å»å¤ççäºæ ï¼æè°å·¥æ¬²åå ¶äºï¼å¿ å å©å ¶å¨ï¼éæ©.NETæ¯æ£ç¡®çï¼ä¸é¢æ们就æ¥éä¸è®²è§£å¨äºæä½æ¹é¢æ们è¦ç¨å°çä¸äºåºæ¬ç¥è¯å½ç¶ä¹æ¯è¸è¿äºæä½é¨æ§çå ³é®ææ¯è¦ç¹ï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
DllImportç¹æ§
é¦å æ们æ¥äºè§£ä¸ä¸DllImport代ç ç¹æ§ï¼å¨è¿è¡äºæä½çæ¶åï¼æ们éè¦ç¨DllImportæ¥æ è¯è¯¥æ¹æ³æ¯éæ管ç代ç æ¹æ³ï¼å¨ç¼è¯å¨ç¼è¯çæ¶åå®è½å¤æ£ç¡®ç认è¯åºè¢«è¯¥ç¹æ§æ è®°çæ¯å¤æ¥ä»£ç 段ï¼æ以è½é¡ºå©çéè¿ç¼è¯ï¼å½å°è¾¾ç¨åºè¿è¡çæ¶åï¼ä¹è½å¤æ£ç¡®ç认è¯åºè¯¥ä»£ç æ¯å¼ç¨éæ管ç代ç ï¼è¿æ ·å°±è®©æ们çCLRå»å è½½éæ管DLLæ件ï¼ç¶åæ¥æ¾å°å ¥å£ç¹è¿è¡è°ç¨ï¼æ们æ¿ä¸ä¸ç¯æç« ä¸ç示ä¾æ¥è®²å§ï¼
[DllImport("Win32DLL.dll",EntryPoint = "add", CharSet = CharSet.Auto, CallingConvention =CallingConvention.StdCall)]
public static extern int AddNumber(int x, int y);
è¿æ®µä»£ç ç³æäºä¸ä¸ªéæ管代ç AddNumberæ¹æ³ï¼æ们æ¥çDllImportç¹æ§çè¿å 个å±æ§å ·ä½ä»ä¹ææï¼å¨DllImportæé å½æ°éé¢æä¸ä¸ªdllnameçåæ°ï¼è¯·çå¾ï¼
å¾1ï¼
æ们å¯ä»¥çå°æ³¨éï¼è¿ä¸ªæé å½æ°çåæ°æ¯éæ管dllçå称ï¼ä¹å°±æ¯æ们æè¦ç¨å°çå¯¼å ¥æ¹æ³çå ·ä½ä½ç½®ï¼ä¸å¾ä¸çåæ°æ¯ "Win32DLL.dll"å符串ï¼ä¹å°±æ¯æ们ä¸ç¯æç« ä¸å建çéæ管C++çææ件ï¼å¨åé¢æå 个ç¸å ³å±æ§ï¼æ们ä¹éä¸æ¥è§£éï¼
DllImportç¹æ§ä¸çEntryPointå¯éå±æ§ï¼
å¾2ï¼
EntryPointå±æ§æ¯ç¨æ¥ç¡®å®éæ管æ¹æ³çå ¥å£ç¹æ¯ä»ä¹ï¼å¨å¾1ä¸ï¼æçéæ管代ç çå ¥å£ç¹å称æ¯addï¼ä¹å°±æ¯è¯´æä¸ä¸ªé®é¢ï¼ç³»ç»å¨è¯å«éæ管代ç å称æ¯é Entrypointå±æ§æ¥çï¼èä¸æ¯æ们å¨C#ç¼è¾å¨ä¸ç³æçæ管代ç çå称AddNumberï¼ç³»ç»åªç¨Entrypointæ¥ç¡®å®éæç®¡å ¥å£ç¹ï¼èæ们å¯ä»¥ç¨éæçå称æ¥å®ä¹éæ管çè°ç¨å称ï¼è¿å¾å¾æ¯ä¸ªå¥½æ¹æ³ï¼ç±äºæ们æ管代ç ç»å¸¸è¦è®²ç©¶ä¸äºå¯¹è±¡åçç¼ç¨æ¹æ³ï¼æ以å¨å½åæ¹é¢ä¹æ¯è³å ³éè¦çï¼ä¸è½éæèµ·ä¸ä¸ªæ²¡æä»»ä½å¯¹è±¡æä¹çå称ï¼è¿æ ·æ们就å¯ä»¥å®ä¹èªå·±çï¼å¤åå½åä¸ä¸æçï¼å¾å½¢è±¡çå称ï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
DllImportç¹æ§ä¸çCharSetå¯éå±æ§ï¼
å¾3ï¼
CharSetå±æ§æ¯ç¨æ¥ç¡®å®å¨æ管ä¸éæ管è°ç¨çè¿ç¨ä¸ç¨ä»ä¹å符ç¼ç æ¥å°éæ°æ®ï¼å 为æ们ç.NETå¹³å°æ¯éç¨çUnicodeç¼ç ï¼èæ åC++æ¯éç¨çAnsiç¼ç ï¼å¨æ们äºè§£äºéæ管代ç çç¼ç æ¹å¼ä¹åï¼æ们就å¾ç¡®å®ç¨ä»ä¹ç¼ç ï¼é£ä¹å¦ææ们ä¸æ¸ æ¥éæ管代ç æ¯ç¨ä»ä¹è¯è¨ç¼åçæè ä¸æ¸ æ¥å®çç¼ç æ¹å¼æ¶ï¼æ们å¯ä»¥ä½¿ç¨CharSetæ举ä¸çautoå¼ï¼è®©CLRèªå¨ä¸ºæ们å¤çç¸å ³ç»èï¼
DllImportç¹æ§ä¸çCallingConventionå¯éå±æ§ï¼
CallingConventionå±æ§ä¹æ¯ä¸ä¸ªæ¯è¾éè¦çå±æ§ï¼å¨å¹³å°è°ç¨çè¿ç¨ä¸èµ·å°æ¥æ¾å ¥å£ç¹çä½ç¨ï¼å¨æ管代ç è¿è¡éæ管代ç å ¥å£ç¹æ¥æ¾æ¶ï¼ä¼éè¿CallingConventionä¸çå¼è¿è¡ç¡®è®¤éæç®¡å ¥å£ç¹çè°ç¨çº¦å®ï¼ä¸ç¯æç« ä¸æ们æå°äºè°ç¨çº¦å®çä¸äºæ¦å¿µï¼
extern"C" _declspec(dllexport) int _stdcall add(int x,int y)
{
return x+y;
}
è¿æ®µæ¯éæ管C++代ç ï¼å¨è¿ä¸ªæ¹æ³åé¢æä¸ä¸ª_stdcallçå ³é®åï¼è¿ä¸ªå ³é®åçæææ¯è¯´æ¹æ³çè°ç¨çº¦å®ï¼æ们æ¥ç_stdcallè°ç¨çç¸å ³æ¦å¿µè¯´æï¼å½æ°çåæ°èªå³åå·¦éè¿æ ä¼ éï¼è¢«è°ç¨çå½æ°å¨è¿ååæ¸ çä¼ éåæ°çå åæ ï¼æææ¯è¯´ï¼æ被è°ç¨æ¹æ¥æ¸ çè°ç¨å æ ï¼
è¿æ_declspec(dllexport)å ³é®ä»£ç ï¼è¿æ®µæææ¯è¯´å°è¯¥æ¹æ³å¯¼åºä¸ºå¯è°ç¨æ¹æ³ï¼ä¹å°±æ¯è¯´å¤æ¥è æ¯å¯ä»¥è°ç¨çæ¹æ³ï¼ç±äºDLLæ件ä¸æ¯æ¯ä¸ä¸ªæ¹æ³é½å¯ä»¥è°ç¨çï¼åªæç¼åè æ¿ææè½ä½¿ç¨ï¼ï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
extern"C"å ³é®ä»£ç ï¼æ¯å称修饰çææï¼å¨ç¼è¯æé´éç¨Cç¼è¯é项æ¥ç¼è¯è¿ä¸ªå½æ°ï¼ç±äºCåC++æ¯ä¸åçè¯è¨ï¼å ·ä½çè¯æ³ä¹ä¸ç¸åï¼æ以å¨C++ä¸æä¾äºéæ©çä½å°ï¼è®©æ们å¯ä»¥éæ©ç¨ä»ä¹ç¼è¯æ¹å¼æ¥ç¼è¯æ¹æ³ï¼å¦ææ们ç¨"C"代ç 修饰äºä¹åï¼ç¼è¯å¨ä¼éè¿åºåä¸åçè°ç¨çº¦å®æ¥éæ°å½åæ¹æ³çå称ï¼
æï¼
__stdcallè°ç¨çº¦å®å¨è¾åºå½æ°ååå ä¸ä¸ä¸ªä¸å线åç¼ï¼åé¢å ä¸ä¸ä¸ª"@"符å·åå ¶åæ°çåèæ°ï¼æ ¼å¼ä¸º[email protected],ä¾å¦ï¼function(int a, int b)ï¼å ¶ä¿®é¥°å为ï¼[email protected]
__cdeclè°ç¨çº¦å®ä» å¨è¾åºå½æ°ååå ä¸ä¸ä¸ªä¸å线åç¼ï¼æ ¼å¼ä¸º_functionnameã
__fastcallè°ç¨çº¦å®å¨è¾åºå½æ°ååå ä¸ä¸ä¸ª"@"符å·ï¼åé¢ä¹æ¯ä¸ä¸ª"@"符å·åå ¶åæ°çåèæ°ï¼æ ¼å¼ä¸º@[email protected]ã
(ç±äºæ¬äººéC++åºèº«æ以æªè½æ»ç»åºèªå·±çä¸å¥ç解æè·¯ï¼åæ¤å ç¨ä¸ä¸ç½æç说æ)
æ»ç»ï¼æ¬ç¯æç« éç¹æ¯è®²è§£DLLImportå ³é®ç¹æ§ç使ç¨ï¼å¨P/Invokeè¿ç¨ä¸çåºæ¬çº¦å®éè¦ç¨è¯¥ç¹æ§æ¥è¡¨ç¤ºï¼ç±äºæ管ä¸éæ管å¨å®ç°æ¹é¢æ¯ä¸ä¸æ ·çï¼è¿æ ·æä¹æ¥åè°è¿ä¸¤ä¸ªå¹³å°ä¹é´çè°ç¨ï¼ææ³.NET为æ们å好äºï¼ ï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
æ¬æåºèª âä¸æ³¨C#ã.NETâ å客ï¼è¯·å¡å¿ ä¿çæ¤åºå¤http://wangqingpei557.blog.51cto.com/1009349/597282
Â
.NETç®è°äºæä½(åï¼åºç¡ç¥è¯ä¹Disposeéæ管å å)
äºæä½ç³»åæç« :
.NETç®è°äºæä½(ä¸ï¼å¼ç¯ä»ç»)
.NETç®è°äºæä½(äºï¼å ç¹ä¸ºå¿«)
.NETç®è°äºæä½(ä¸ï¼åºç¡ç¥è¯ä¹DllImportç¹æ§)
.NETç®è°äºæä½(åï¼åºç¡ç¥è¯ä¹Disposeéæ管å å)
.NETç®è°äºæä½(äºï¼åºç¡ç¥è¯ä¹Dynamicå¹³å°è°ç¨)
.NETç®è°äºæä½(å ï¼åºç¡ç¥è¯ä¹æåå¹³å°è°ç¨æ§è½)
.NETç®è°äºæä½(ä¸ï¼æ°æ®å°éä¹ä»ç»)
æ们继ç».NETäºæä½å¦ä¹ ãåä¸ç¯æç« ä¸æ们å¦ä¹ äºåºç¡ç¥è¯ä¸çDllImportå ³é®ç¹æ§ï¼æ们继ç»å¦ä¹ åºç¡ç¥è¯ä¸çå åéæ¾ç¸å ³ææ¯ï¼
å¨æ管ä¸éæ管å åä¹é´ï¼æ¯ä¸å 许ç´æ¥è°ç¨è¿è¡ç¸äºæä½çï¼è¿ç¹æç¸ä¿¡ç¨å¾®æç¹.NETææ¯åºç¡ç人é½è½äºè§£ï¼ä¸ä¸ç¯æç« ä¸æä½æåæåºäºäºé®é¢ï¼å好æ们å¨è¿éå°±å½æ¯å¦ä¹ æ¥ç²ç¥çåæä¸ä¸ï¼é®é¢å¤§æ¦æ¯è¿æ ·çï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
1.å¨.NETæ管平å°ä¸ç对象ä¸éæ管ç对象ä¹é´æ¯å¦è½ç´æ¥äºæ¢ï¼
2.æ管å åä¸éæ管å åæ¯å¦åå¨å·®å¼ï¼å¦æåå¨å·®å¼æ¯å¦ææ¹æ³è½è¿è¡ç价转æ¢æè å«åçä»·å¤å¶ï¼
æ们就ä¸é¢ä¸¤ä¸ªé®é¢æ¥è¯¦ç»åæä¸ä¸ï¼ç±äºæ¬äººä¹å¨å¦ä¹ è¿æ¹é¢çç¥è¯æ以ç解çä¹ä¸æ¯å¾éå½»ï¼åªè½æ¯ä¸äºå¾®èççæµå§ï¼å¤§å®¶ä¸èµ·æ¥å¸®å¿åæï¼
第ä¸ä¸ªé®é¢ï¼å¨.NETæ管平å°ä¸ç对象ä¸éæ管ç对象ä¹é´æ¯å¦è½ç´æ¥äºæ¢?å ¶å®ç¬¬ä¸ä¸ªé®é¢æ¯éèå¨ç¬¬äºä¸ªé®é¢éé¢çï¼é¦å æ们è¦ç¡®å®çæ¯ï¼âäºæ¢âä¸â转æ¢âçæ¦å¿µï¼ä¸ºäºç»ä¸å¤§å®¶æ¥ä¼ï¼æä»¬å¿ é¡»å°âäºæ¢âä¸â转æ¢âåä¸äºå®ä¹ï¼
âäºæ¢âï¼æåå®æ两åå å空é´ï¼æ¯åå å空é´åå¨ä¸åç对象ï¼æ¯å¦ï¼å¨ä¸åéæ管å ååä¸ä¿åçChar*ç±»åçæéï¼å¨å¦ä¸åæ管å ååä¸ä¿åçStringç±»åçå¼ï¼ç±äºChar*æ¯æéç±»åï¼èæ们çæ管Stringæ¯.NETå¹³å°ç±»åï¼å¾®å°çååå°±å¯è½å¼èµ·å åå¸å±ä¸åçå¯è½ï¼æ°æ®ç»æéé¢è®²å°ï¼åéå为ååååç»æåï¼ååååéé½åå¨çåé¢å¼çæ¦å¿µï¼ä»ä¹å«åé¢å¼å°±æ¯æ们人ç¨æ¥äº¤æµçæ°æ®å¼ï¼æ¯å¦ï¼boolç±»åçtrueåfalseï¼ä¸¤åå åä¸ä¿åçä¸è¥¿æ¯ä¸ä¸æ ·çï¼é«çº§è¯è¨å¨ç»åäºä¸ç³»åç¼è¯å¨å¤çä¹åï¼ä¼ç¡®å®ä¸æ¥å åä¸ä¿åçæ°æ®æ¯ä»ä¹æ ·åçï¼ä¹å°±æ¯è¯´å åçåé ååæ¯æç §å¯¹è±¡çç±»åæ¥çï¼å¨æ管ä¸éæ管çå å空é´ä¸ï¼ä¸åçå¹³å°ææçå¼ç¨å°åç±»åä¹åä¸ç¸åï¼å½ç¶å¦æè½æåçâäºæ¢â就说æè½å¨æ管ä¸éæ管ä¹é´è¿è¡ç´æ¥æ°æ®è®¿é®äºï¼æ»ä¹äºæ¢æ¯ä¸¤ä¸ªå¯¹è±¡ä¹é´çå½¼æ¤è½¬æ¢ï¼æ¯ååçï¼
â转æ¢âï¼è½¬æ¢çæ¦å¿µæ个人è§å¾æ¥æºäºé«çº§è¯è¨çè¯æ³è§£éèå·²ï¼æè°è½¬æ¢å ¶å®ä¹å°±æ¯aå°bç转æ¢ï¼å°ä¸ç§ç±»å转æ¢æå¦ä¸ç§ç±»åçå¨è¯æè¿°ï¼æä»¬å ·ä½ç¹æ个æ¯æ¹ï¼å¦ææä¸ä¸ªå¯¹è±¡æ¯aï¼æä¸ä¸ªå¯¹è±¡æ¯bï¼ææ³å°a转æ¢æbï¼å°±æ¯å°å¯¹è±¡ä»ä¸ç§ç¶æ转æ¢æå¦ä¸ç§ç¶æï¼æ»ä¹è½¬æ¢æ¯ååçï¼åªè½æ¯ä¸ç§å°å¦ä¸ç§ç转æ¢ï¼
é对ä¸è¿°æ们åæçç»æï¼ç±äºæ¶é´æ¯è¾ç´§ï¼æ们ä»ç¬¬äºä¸ªé®é¢å ¥æå§ï¼å 为æ¬ç¯æç« ä¸æ¯è§£å³é®é¢ä¸ºä¸»çï¼ç»è¿ä¸é¢çåææ们确å®æ管å åä¸éæ管å åçç»ææ¯ä¸ä¸æ ·çï¼è¿ç§ä¸ä¸æ ·å¹¶ä¸æ¯ææç对象类åé½ä¸ä¸æ ·ï¼å¨.NETå¹³å°éé¢æä¸äºå¦ï¼intï¼charä¹ç±»çå¹³å°çä»·ç±»åï¼æ¯å¯ä»¥ç´æ¥äºæ¢çï¼å¦ææ¯ä¸äºéçä»·ç±»åï¼è¦æ³æåè¿è¡è½¬æ¢å°±å¿ é¡»å¾åå©äºæç®¡å¯¹è±¡å ³äºäºæä½æ¹é¢çç¥è¯äºï¼ç±äºè¿æ ·ä¸æ¯å¯è½ä»å¤©è¿ç¯æç« æ¯è®²ä¸å®äºï¼è¿éå°±ç²ç¥çè¿ä¸ä¸å§ï¼æ们ä¸é¢è¿å ¥ä»å¤©ç主é¢ï¼å ¶å®æäºæ¦å¿µççä¸å¤ªå¥½è®²ï¼ä½ è¦è¯´æ管ä¸éæ管å åä¸ä¸æ ·ï¼æ人ä¼é®ä¸ä¸æ ·å¨ä»ä¹å°æ¹ï¼çç没æ说ææ§ççç±ï¼
å ³äºéæ管å åéæ¾çé®é¢
ä¼¼ä¹ä»å¤©ç主é¢å°±æ¯å ³äºæ管ä¸éæ管å åçé®é¢ï¼å好è½è¯¦ç»ç说æä¸é¢çé®é¢ï¼è¦æ³å¨æ管å åä¸éæ¾éæ管å åï¼æ²¡æé£ä¹ç®åï¼ä¸åç代ç åºï¼è°ç¨çåé å åçæ¹æ³ä¸ä¸æ ·ï¼ç®æ³ä¹å°±ä¸ä¸æ ·ï¼Cçåé ä¸åæ¶æ¯mallocãfreeï¼C++çæ¯newãdeleteï¼COMæ¯CoTaskMemAllocãCoTaskMemFreeï¼å¨æä½ç³»ç»è¿ä¹å¤§çä¸ä¸ªå¹³å°ä¸åå¨çååä¸ä¸ç§å åæä½æ¹å¼ï¼å¤§å®¶æå±æ§çæ¯ä¸è¿°å ç§ï¼æå¯è½é£ä½ææ¯ç人èªå·±åäºä¸å¥å ååé ååæ¶çDLLï¼é£ä¹æ们ä¸å¯è½è®©.NETä¸å³æ°¸é¸ï¼æ以åå¨çè¿äºä¸ç¡®å®å ç´ ï¼(æç©¿æä¸å¥åºè¯ï¼å ¶å®ä¸ç®¡æ们æ说çåºå±æ¯ä»ä¹æ ·åçï¼åªæççè¶è¿äºå æ ¸å°äºç¡¬ä»¶æ½è±¡å±çè³å°äºé©±å¨é¨åï¼1å°±æ¯1ï¼2è¿æ¯2ï¼è¯¥èµ°çè·¯ç¨è¿æ¯ä¼èµ°ï¼æ们åä¸ä¸è¦ç¥ç§è¯åºå±ï¼åªè¦æ们æ±çä¸é¢æ¢ç´¢çå¿ä»ä¹é½OK)ï¼
.NETå¹³å°çé»è®¤å ååé ååæ¶é½æ¯åºäºCOM(ç»ä»¶å¯¹è±¡æ¨¡å)çï¼ç±äºCOMæ¯ä¸å¥éæ管年代çå ¬ç¨ååï¼æ以微软åªè½åå°è¿ä¸ªä½ç½®äºï¼å¦æéæ管å åæ¯ç¨COMçCoTaskMemAllocåé çé£ä¹.NETçå°éææ¶å¨ä¼èªå¨çéæ¾æé£åå åï¼å¦ææ¯éæ管å åæ¯éç¨Cçæè C++æè å ¶ä»çä»ä¹æ¹å¼åé ç.NETæ ¹æ¬ä¸ç¥éä½ æ¯æä¹åé çï¼æ以è¿ä¸ªæ¶åéè¦æ们éç¨æä¸çåæ³æ¥è§£å³ãéæ管çå åéæ¾åªæéæ管ç¥éï¼æ以å¨éæ管ä¸å®ä¹ä¸ä¸ªéæ¾éæ管èµæºçæ¹æ³ï¼ç¶åå¨ç¨.NETå¹³å°å»è°ç¨è¿ä¸ªéæ管æ¹æ³æ¥è¿è¡éæ¾å åï¼ä¸é¢æ们æ¥çä¸ä¸ªå°ä¾åï¼ä»¥è¯´æé®é¢ä¸ºä¸»ï¼
å¾1ï¼
è¿æ¯éæ管ç代ç ï¼ç±äºæ¶é´å ³ç³»æ就没æåå ·ä½çæä½äºï¼è¯´æåçå°±è¡äºï¼
å¾2ï¼
è¿æ¯å¨æ管.NETå¹³å°ä¸é¢å®ä¹çéæ管代ç è°ç¨å ³ç³»ï¼
å¾3ï¼
è¿æ ·ä¸æ¥ï¼ä¸ç®¡éæ管çå åæ¯éç¨ä»ä¹æ¹æ³åé çå åæ们é½è½å¨æ管ä¸å°å ¶éæ¾ï¼é¦è¦çååå°±æ¯æä»¬å¿ é¡»æ¸ æ¥éæ管å åçåé æ¹æ³ï¼å¦æä¸æ¸ æ¥çæ åµä¸ï¼é»è®¤æ¯COMçéæ¾æ¹æ³ï¼çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å
æ¬æåºèª âä¸æ³¨C#ã.NETâ å客ï¼è¯·å¡å¿ ä¿çæ¤åºå¤http://wangqingpei557.blog.51cto.com/1009349/599284
Â
.NETç®è°äºæä½(äºï¼åºç¡ç¥è¯ä¹Dynamicå¹³å°è°ç¨)
äºæä½ç³»åæç« :
.NETç®è°äºæä½(ä¸ï¼å¼ç¯ä»ç»)
.NETç®è°äºæä½(äºï¼å ç¹ä¸ºå¿«)
.NETç®è°äºæä½(ä¸ï¼åºç¡ç¥è¯ä¹DllImportç¹æ§)
.NETç®è°äºæä½(åï¼åºç¡ç¥è¯ä¹Disposeéæ管å å)
.NETç®è°äºæä½(äºï¼åºç¡ç¥è¯ä¹Dynamicå¹³å°è°ç¨)
.NETç®è°äºæä½(å ï¼åºç¡ç¥è¯ä¹æåå¹³å°è°ç¨æ§è½)
.NETç®è°äºæä½(ä¸ï¼æ°æ®å°éä¹ä»ç»)
æ们继ç».NETäºæä½å¦ä¹ ãå¨ä¸ç¯æç« ä¸æ们å¦ä¹ äºå ³äºæ管ä¸éæ管å åDispose(éæ¾)é®é¢ï¼ä¸é¢æ们继ç»å¦ä¹ åºç¡ç¥è¯ä¸çDynamic(å¨æ)å¹³å°è°ç¨ææ¯ï¼
å¨åå ç¯æç« ä¸ï¼æ们é½æ¯éç¨æé¨å°±ççæ¹å¼æ¥è°ç¨éæ管代ç çï¼å å®ä¹éæ管代ç çæ管å®ä¹ï¼ç¶åç¨DllImportæ¥æ è¯ç¸å ³è°ç¨çº¦å®ï¼è¿ç¯æç« æ们å°ä»ç»æä¹éè¿å¨æçæ¹å¼è°ç¨éæ管代ç ï¼å¨è¿è¡è®²è§£ä¹åæ们æå¿ è¦ç®åçäºè§£ä¸ä¸ï¼æ管代ç è°ç¨éæ管代ç ç大æ¦çæ¥éª¤æè 说æ¯ç¸å ³ç»èå§ï¼åªæå½æ们èåéæä¸å¥å±äºèªå·±çç解æè·¯æ¶ï¼æç« ææ¾çæä»·å¼ï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
å¹³å°è°ç¨è¿ç¨åç
æå使ç¨å§ç»æ²¡æå¾çç表达æ§å¼ºï¼æ们è¿æ¯æ¥çå¾å§ï¼
å¾1ï¼
è¿å¹ å¾ç»çä¸æ¯å¾å ¨ï¼ä½æ¯å¤§æ¦è½è¡¨è¾¾ææäºï¼
å½æ们第ä¸æ¬¡è°ç¨éæ管DLLæ件çæ¶å(ç©¿æä¸ä¸ï¼è¿éå°±çµæ¯å°ä¸ºä»ä¹æäºä¸è¥¿å¿ é¡»ç±æä½ç³»ç»æ¥å¤çï¼ä¸ºä»ä¹è¦æå æ ¸ï¼å°±æ¯ç¨æ¥å¤çä¸äºæ们平æ¶ä¸è½é便å¨çä¸è¥¿ï¼å°±æ¿LoadLibraryæ¹æ³æ¥è®²ï¼å¯è½å®å°±æ¯è¿å ¥äºå æ ¸ç¶å设置ç¸å ³åæ°ï¼å¸®æ们ä¿åäºéæ管DLLå¨å åç代çåæ ¹ï¼å½æ们ä¸æ¬¡åè¿å ¥å°å æ ¸çæ¶åï¼ç³»ç»å»æ£æ¥ä¸ä¸ï¼åç°æè¿ä¸æ¬¡è°ç¨äºï¼æ以ä¸æ¬¡å°±å»è¯»ååæ ¹ä¸çå°åè¿è¡è°ç¨)ï¼ç³»ç»ä¼å»å è½½éæ管DLLæ件å°å å并设置ç¸å ³æ°æ®ï¼ä»¥ä¾¿åæ使ç¨ï¼å¨æè°ç¨çåçå°±æ¯æ们æè¿é¨åçå·¥ä½èªå·±æå¨æ¥åï¼æ¯å¦ç¬¬ä¸æ¬¡è°ç¨éæ管DLLè¯å®æ¯è¦æ ¢äºåé¢è°ç¨çï¼æ以å¨ä¸äºå¿ è¦çåºåä¸ï¼æ们ççæå¿ è¦è¿è¡å¨æP/Invokeï¼
å¨æå¹³å°è°ç¨ç¤ºä¾1
å¨æ管ç.NETä¸æ们å¯ä»¥éè¿ä½¿ç¨Win32APIä¸çLoadLibraryæ¹æ³æ¥æå¨å è½½éæ管DLLå°å åæ¥ï¼
[DllImport("kernel32.dll",EntryPoint = "LoadLibrary")]
public static extern IntPtr LoadLibrary(string iplibfilenmae);
è¿æ ·çæä½å°±å¥½æ¯æ们å¾1ä¸ç第ä¸æ¬¡è°ç¨è¿ç¨è¦æ§è¡çæä½ï¼
[DllImport("Win32DLL.dll",EntryPoint = "add", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern int add(int x, int y);
åæ ·æ们è¿æ¯ç³æéæ管代ç çå®ä¹ï¼æ们æ¥çå ¨é¨ä»£ç ï¼
namespaceCSharp.Interop
{
/// <summary>
/// å¨æå¹³å°è°ç¨ï¼æå¨å è½½éæ管DLLæ件
/// </summary>
public static class DynamicPinvoke
{
[DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]
public static extern IntPtr LoadLibrary(string iplibfilenmae);
[DllImport("Win32DLL.dll", EntryPoint = "add", CharSet =CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern int add(int x, int y);
public static void Test()
{
string currentdirectory =Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string dllpath = Path.Combine(currentdirectory, "Win32DLL.dll");
IntPtr dlladdr = LoadLibrary(dllpath);
if (dlladdr == IntPtr.Zero)
throw new DllNotFoundException(string.Format("å¨{0}æªè½æ¾å°ç¸å ³DLLæ件", dllpath));
int addnumber =add(10, 20);
Console.Write(addnumber);
}
}
}
å¨æå¹³å°è°ç¨ç¤ºä¾2
第ä¸ä¸ªç¤ºä¾æ们æ¯çç¥äºç³»ç»è°ç¨è¿ç¨ï¼æ们æå¨è°ç¨LoadLibraryæ¥å è½½ï¼å¯è½æ²¡å¥å¤§çååï¼ç¤ºä¾2æ¯éè¿éæ管å½æ°å§ææ¥è¿è¡å¨æè°ç¨çï¼
é½ç¥éæ管å§æ就好æ¯éæ管çå½æ°æéï¼å¹¸å¥½å¾®è½¯ä¸ºæ们æä¾äºå§ææ¥è°ç¨éæ管æ¹æ³ï¼éåççå¾å¼ºå¤§ï¼è¯·ç代ç ï¼
[UnmanagedFunctionPointer(CallingConvention.StdCall)][çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
delegate int add(int x, int y);
ç³»ç»ç¹æ§è½æ¹å代ç çç¼è¯è¡ä¸ºï¼æ以æ们æçç±ç¸ä¿¡æ们çaddå§æå·²ç»åæäºéæ管代ç çå¼ç¨ï¼
namespaceCSharp.Interop
{
[UnmanagedFunctionPointer(CallingConvention.StdCall)]
delegate int add(int x, int y);
public static class DelegateInvoke
{
public static void Test()
{
string currentdirectory =Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
string dllpath = Path.Combine(currentdirectory, "Win32DLL.dll");
IntPtr dlladdr = Interop.DynamicPinvoke.LoadLibrary(dllpath);
if (dlladdr == IntPtr.Zero)
throw new DllNotFoundException(string.Format("å¨{0}æªè½æ¾å°ç¸å ³DLLæ件", dllpath));
IntPtr procadd = Win32Api.GetProcAddress(dlladdr, "[email protected]");
if (procadd == IntPtr.Zero)
throw new DllNotFoundException(string.Format("æªè½å¨å åä¸æ¾å°{0}å ¥å£ç¹",Marshal.PtrToStringUni(dlladdr)));
add adddelegate = (add)Marshal.GetDelegateForFunctionPointer(procadd,typeof(add));
int result = adddelegate(10, 20);
bool isfree = Win32Api.FreeLibrary(dlladdr);
}
}
}
è¿æ®µå°å°ç代ç éï¼æ·±èäºå¾å¤ææ¯ç»èï¼éæ管代ç 导åºè°ç¨æ¹æ³æ¶æ们éè¦ç¥éå½æ°å被éæ´æå¥æ ·äºï¼æ以æ¬äººä¸ä¼ äºPEæ件æ¥çå¨http://files.cnblogs.com/wangiqngpei557/PEinfo.zipï¼éè¿è¿ä¸ªå·¥å ·æ们æ¥çéæ管代ç çå ·ä½ä¿¡æ¯ï¼è¿æ ·ä¾¿äºæ们è°ç¨ï¼
Marshalæ¯ä¸ä¸ªå¾å¼ºå¤§çP/Invokeçç±»ï¼å¯ä»¥å°å®çææ¯å¹³å°è°ç¨çä½ç°å§ï¼Marshal.GetDelegateForFunctionPointeræ¹æ³æ¯éè¿éæ管å åæéè·åUnmanagedFunctionPointerç±»åçå§æï¼
æ»ç»ï¼å ¶å®å¨æè°ç¨å°±æ¯è®©æ们ç«å¯è½çå¤å»æ¥è§¦åºå±ç¥è¯ï¼ä¸åé½æ¯å¯ä»¥ç解çï¼åªæ¯å夫没å°å®¶ï¼
Â
.NETç®è°äºæä½(å ï¼åºç¡ç¥è¯ä¹æåå¹³å°è°ç¨æ§è½)
äºæä½ç³»åæç« :
.NETç®è°äºæä½(ä¸ï¼å¼ç¯ä»ç»)
.NETç®è°äºæä½(äºï¼å ç¹ä¸ºå¿«)
.NETç®è°äºæä½(ä¸ï¼åºç¡ç¥è¯ä¹DllImportç¹æ§)
.NETç®è°äºæä½(åï¼åºç¡ç¥è¯ä¹Disposeéæ管å å)
.NETç®è°äºæä½(äºï¼åºç¡ç¥è¯ä¹Dynamicå¹³å°è°ç¨)
.NETç®è°äºæä½(å ï¼åºç¡ç¥è¯ä¹æåå¹³å°è°ç¨æ§è½)
.NETç®è°äºæä½(ä¸ï¼æ°æ®å°éä¹ä»ç»)
æ们继ç».NETäºæä½å¦ä¹ ãæ¬ç¯æç« æ们å°æ¥å¦ä¹ äºæä½åºç¡ç¥è¯ä¸çæåä¸ä¸ªç¥è¯ç¹âæåå¹³å°è°ç¨çæ§è½âï¼
å¨äºéæ管å½æ°è¿è¡äºæä½çè¿ç¨ä¸ï¼ç±äºæ¶åçææ¯å æ°ä¼å¤ï¼å æ¤ç¨åºçæ§è½ä¼åå°è¿äºå ç´ çå½±å导è´æ§è½ä¸éï¼æ¬ç¯æç« å°æ¥ä»ç»å¨å¹³å°è°ç¨è¿ç¨ä¸æåæ§è½çä¸äºè®¾è®¡åç¼ç æ¹é¢çæå·§ï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
ä¸ï¼æ¾ç¤ºçå¶å®è¦è°ç¨çéæ管å½æ°å称
æ们å¨è¿è¡å¹³å°è°ç¨çæ¶åï¼å¦æCLRæ æ³å¨éæ管DLLä¸æ¾å°ä¸DllImportç¹æ§æå®çå½æ°åç¸åçéæ管å½æ°ï¼é£ä¹CLRä¼å°è¯éç¨ä¸äºè§åéæ°è¿è¡æç´¢ãæ¯å¦æ们å°sumAéæ管å½æ°çCharSetç³æ为CharSet.Ansiï¼é£ä¹CLRé¦å ä¼éè¿æ ¹å½æ°å(sum)è¿è¡æç´¢ï¼å¦æå¨æå®çéæ管DLLä¸æ¾å°äºæ¤å½æ°ï¼å°±æ¯ç¨å®ãå¦æä¸è½æ¾å°ï¼å°±ä¼ä½¿ç¨å¸¦åç¼Açå½æ°(sumA)è¿è¡æç´¢ãå ¶å®ä¸ºä»ä¹ä¼åºç°è¿ç§æ åµï¼åå æ¥èªäºå符ç¼ç çä¸åï¼æçå½æ°å®ç°æ¯éç¨Ansiæ¹å¼ï¼æçéç¨Unicodeæ¹å¼ï¼è¿ä¸¤ç§ç¼ç æ¹å¼çä¸åæç»å¯¼è´æ°æ®å¨å åçåæ¾ä¹ä¸åï¼æ以å¨è¿è¡éæ管è°ç¨çæ¶åï¼æ们éè¦æ³¨æï¼
éæ管代ç ï¼
1.   extern "C" _declspec(dllexport) int _stdcalladdA(int x,int y)Â
2.   {Â
3.    return x+y;Â
4.   }
æ管代ç ç³æ1ï¼
1.   [DllImport("Win32DLL.dll",EntryPoint ="add", CharSet = CharSet.Ansi, CallingConvention =CallingConvention.StdCall)]Â
2.   public static extern int add(int x, int y);Â
3.   Â
æ管代ç ç³æ2ï¼
1.   [DllImport("Win32DLL.dll",EntryPoint ="addA", CharSet = CharSet.Ansi, CallingConvention =CallingConvention.StdCall,ExactSpelling=true)]Â
2.   public static extern int add(int x, int y);Â
3.   Â
ä¸é¢ä¸¤æ®µæ管代ç ç³ææäºç»å¾®çä¸åçï¼ç¬¬ä¸ä¸ªæ管代ç æ¯æ们常è§çç³ææ¹å¼ï¼è第äºä¸ªæ¯æ们å°è§çç³æï¼ä¸¤ç§ä¸åçç³ææ¹å¼å¯¹CLRçå¹³å°è°ç¨æ¥è¯´æ¯ä¸ä¸æ ·çï¼ç¸å¯¹èè¨çè°ç¨è¿ç¨ä¹æå°è®¸çä¸åï¼ç»æµè¯ç¬¬äºç§çç³æè½æåå°è®¸çæ§è½ï¼ç¬¬äºç§ç代ç ç³æä¸åºç°äºExactSpelling=true(æ¾å¼çæå®è¦è°ç¨çéæ管å½æ°çå称)ï¼è¿æ®µä»£ç çæææ¯è¯´ï¼æ们强å¶ä½¿ç¨EntryPointç³æçæ¹æ³å ¥å£ç¹ï¼ä¸å 许CLR帮æ们å»å¨æçè°æ´å½æ°çå称å¨å»æ¥æ¾å ¥å£å称ï¼è¿æ ·è½çæäºCLRçæ¥æ¾æ¶é´ï¼
äºï¼å¯¹æ°æ®å°éå¤çè¿è¡ä¼å
å¨æ管代ç ä¸éæ管代ç ä¹é´ä¼ éåæ°æ¶ï¼æ 论æ¯ä¼ å ¥è¿æ¯ä¼ åºï¼é½è¦ç»è¿å°éææ¶å¨çå°éå¤çãç±äºå°éè¿ç¨å¯è½ä¼æ¶åæ°æ®ç±»åç转æ¢ï¼ä»¥åå¨éæ管å åä¸éæ管å åä¹é´æ¥åå¤å¶æ°æ®ï¼æ以å°éå¤çä¹æ¯å½±åå¹³å°è°ç¨æ§è½çç¶é¢ä¹ä¸ã
CLRå¨è¿è¡æ°æ®å°éæ¶ï¼åªæ两ç§éæ©çæ¹å¼ï¼è¦ä¹éå®æ°æ®ãè¦ä¹å¤å¶æ°æ®ãå¨é»è®¤çæ åµä¸CLRä¼å¨å°éè¿ç¨ä¸å¤å¶æ°æ®ï¼åå¦æ们éè¦å°ä¸ä¸ªUnicodeå符串ä½ä¸ºAnsiä¼ éå°éæ管代ç ä¸æ¶ï¼é¦å CLRä¼å°å符串å¤å¶ä¸ä»½åºæ¥ï¼ç¶åå°å¤å¶åºæ¥çå符串è¿è¡è½¬æ¢æAnsiï¼ç¶åå¨å°è½¬æ¢åçAnsiå符串çå åå°åä¼ éç»éæ管代ç ï¼ç±äºå¤å¶æ°æ®æä½å¯è½å¾æµªè´¹æ¶é´ï¼æ以å°éæ°æ®ä¹æ¯å½±åæ§è½çç¶é¢ä¹ä¸ï¼
æ°æ®å°éè¿æä¸ç§å°±æ¯éå®å åçæ¹å¼ï¼ææå°±æ¯è¯´CLRå¯ä»¥éè¿ç´æ¥å°æ管对象éå®å¨åå¾åæ¶å ä¸ï¼å·²é²æ¢æ管对象å¨å½æ°è°ç¨çå½å¨æå 被åæ¶ï¼ä¸æ¦æ管对象被éå®ï¼å°±å¯ä»¥ç´æ¥å°æåæ管对象çæéä¼ éç»éæ管代ç ä¸ï¼è¿æ ·å°±é¿å äºå¤å¶æ°æ®çæä½ï¼è¾¾å°ä¼åçç®çï¼
ä½æ¯ä¸æ¯ææçæ°æ®ç±»åé½è½è¢«éå®çï¼è¦æ³è½è¢«éå®ï¼å¿ é¡»å ·å¤ä¸äºè·å¹³å°ç¸å ³ç约å®ï¼æ们æ¥çè¦æ»¡è¶³é£äºæ¡ä»¶ç对象æè½è¢«CLRéå®ï¼
1.å¿ é¡»æ¯æ管代ç è°ç¨éæ管代ç ï¼ä¹å°±æ¯æ¬æºä»£ç ï¼
2.æ管æ°æ®ç±»åå¿ é¡»æ¯å¯ç´æ¥å¤å¶å°æ¬æºç»æ(blittable)ä¸çæ°æ®ç±»åï¼æè è½å¤å¨æ»¡è¶³æäºæ¡ä»¶ä¸è½¬æ¢ææ¬æºç»ææ°æ®ç±»åï¼
3.ä¼ éçä¸æ¯å¼ç¨(ref,out)åæ°ï¼
4.被è°ç¨ä»£ç åè°ç¨ä»£ç å¿ é¡»å¤äºåä¸çº¿ç¨ä¸ä¸ææè 线ç¨åå ä¸ï¼
ç»è¿æ们ä¸é¢çæ»ç»ï¼æ们就å¯ä»¥åç°ï¼è¦æ³åå°å°éææ¶å¨çæ°æ®å¤å¶æä½ï¼æ们å¯ä»¥ç¨æ¬æºç»æç±»åè¿è¡ä¼ éï¼æè°æ¬æºç»æç±»åå°±æ¯å¨æ管å åä¸åéæ管å åä¸ç表示形å¼æ¯å®å ¨ä¸æ ·çã[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
æ以å¨åå¤å¼åå¹³å°è°ç¨ç¨åºæ¶ï¼æ们尽éçèè使ç¨æ¬æºæ°æ®ç»æï¼å¦ï¼System.Byte:æ 符å·8ä½æ´åãSystem.SByte:æ符å·8ä½æ´åï¼
æ»ç»ï¼ç±äºè¿ç¯æç« æ¶åå°äºæ°æ®å°éçç¸å ³ææ¯ï¼å¾å¿«æ们ç»æäºåºç¡é¨åçå¦ä¹ ï¼ä¸é¢æ们å°è¿å ¥å¦ä¹ äºæä½æ°æ®å°éç¸å ³ææ¯ï¼
æ¬æåºèª âä¸æ³¨C#ã.NETâ å客ï¼è¯·å¡å¿ ä¿çæ¤åºå¤http://wangqingpei557.blog.51cto.com/1009349/601796
Â
.NETç®è°äºæä½(ä¸ï¼æ°æ®å°éä¹ä»ç»)
äºæä½ç³»åæç« :
.NETç®è°äºæä½(ä¸ï¼å¼ç¯ä»ç»)
.NETç®è°äºæä½(äºï¼å ç¹ä¸ºå¿«)
.NETç®è°äºæä½(ä¸ï¼åºç¡ç¥è¯ä¹DllImportç¹æ§)
.NETç®è°äºæä½(åï¼åºç¡ç¥è¯ä¹Disposeéæ管å å)
.NETç®è°äºæä½(äºï¼åºç¡ç¥è¯ä¹Dynamicå¹³å°è°ç¨)
.NETç®è°äºæä½(å ï¼åºç¡ç¥è¯ä¹æåå¹³å°è°ç¨æ§è½)
.NETç®è°äºæä½(ä¸ï¼æ°æ®å°éä¹ä»ç»)
æ们继ç».NETäºæä½å¦ä¹ ãäºæä½çåºç¡ç¥è¯å·²ç»å·®ä¸å¤å®äºï¼å½ç¶ä¸ç¯å°å°çæç« å¾é¾å ¨é¢ç讲述äºæä½çæ¹æ¹é¢é¢ï¼æ¬äººåªæ¯æ»ç»åºå ³é®çå°æ¹å¥½è®©æ们è½å ¥ä¸ªé¨ï¼å¨åæå¦ææ³è¦æ´æ·±å ¥çå¦ä¹ ï¼è¯å®éè¦ä¸æ¬è¯¦ç»èå ¨é¢ç书ç±æè¡ãæ³è¦ç²¾é.NETäºæä½å½ç¶ä¹å°ä¸äºå¯¹éæ管çææ¯å¦ä¹ ï¼C++ãCOMççï¼åªææ¢çæ.NETä¹çæéæ管ææ¯æè½å°äºæä½èä¼è´¯éãä»è¿ç¯æç« èµ·æ们å°è¿å ¥å°.NETäºæä½çæ°æ®å°éé¶æ®µï¼æ°æ®å°éæ¯.NET/Pinvokeå ³é®çé¨åï¼ä»»ä½æ管代ç æ³è¦åéæ管代ç äºæä½ï¼å°ä¸äºæ°æ®çä¼ éè¿åï¼[çæ¸ å¹çæææï¼è½¬è½½è¯·ç»åºç½²å]
1ï¼
å¨æ管代ç è°ç¨éæ管代ç çæ¶åï¼æ°æ®ç»åäºå¾å¤æçå°éãç±äºæ管çæ°æ®ç±»åä¸éæ管çæ°æ®ç±»åå åç»æå¯è½æ¯ä¸ä¸æ ·çï¼è¦æ³å°æ管æ°æ®åæ°ä¼ éå°éæ管代ç ä¸ï¼å¹¶ä¸è½æåçæ¥åå°éæ管çè¿åå¼ï¼æ们éè¦å¾ä¸¥æ ¼çæç §åæ¹çæ°æ®ç±»å约å®æ¥æè¡ãæ¯å¦å¨C++ä¸çChar*æ¯ä¸ä¸ªå符æéï¼å½æ们æ³è¦å°åç¬¦ä¸²ä¼ éå°éæ管代ç ä¸æ¶ï¼æ们éè¦èèæä¹å°åæ°æ å·®éçå°éå°éæ管代ç ãèå¨æ管C#ä¸çStringç±»åæ¯ä¸ä¸ªå¼ç¨ç±»åï¼ä¸¤è æç¸åç¹ï¼ä¹æä¸åç¹ã
å¨æ们ç¨.NET/PInvokeè¿è¡Win32APIçè°ç¨çæ¶åï¼å¤§å¤æ°çæ åµä¸æ们æ¯éè¦ä¼ éæç§ç»æç±»åç»APIï¼ç¶åå¨æ¥åè¿åå¼ï¼å¨æ°æ®å°éçè¿ç¨ä¸ï¼æäºæ¦å¿µæ¯æ们平æ¶ä¸æ¾ç¢°è§çã.NETæ°æ®å°éå¾æºè½ï¼CLRçå°éææ¶å¨è½éè¿è¯å«æä»¬ä¼ éçæ°æ®ç±»åæ åµè¿è¡èªå¨éæ©å°éæ°æ®çæ¹å¼ï¼æ¯å¦æ们å°ä¸ä¸ªClassç类类åä¼ éç»éæ管APIï¼é»è®¤çClassç±»æ¯ä¸è½è¿è¡äºæä½ä½¿ç¨çï¼å¿ é¡»å ä¸ç¸åºçç¹æ§è¿è¡æ è®°ï¼ç¼è¯å¨ç¼è¯çæ¶åè½è¯å«åºè¿æ¯è¦è¿è¡å°éçæ°æ®ç±»åï¼å°Classç±»åè¿è¡å°éæ¶ï¼å°éææ¶å¨ä¼è¿è¡å¤æï¼å¦ææä»¬ä¼ éç»éæ管代ç çClassä¸çææå é¨å¯¹è±¡é½æ¯å¹³å°æ°æ®ç±»åï¼é£ä¹CLRä¼å°è¿ä¸ªå¯¹è±¡å¨å åä¸éå®ï¼ç¶åç´æ¥å°å åå°åå°éç»éæ管代ç ï¼éæ管代ç ç´æ¥å¯¹è¿æ°æ®è¿è¡æä½ãè¿æ¯å°éå¼ç¨å°åçæ¹å¼ï¼å¦ææä»¬ä¼ éç»éæ管APIçæ¯éå¹³å°ç±»åï¼é£ä¹CLRçå°éææ¶æ¶å¨ä¼å°æ们çæ管类åå¤å¶åºæ¥è¿è¡éæ管类å转æ¢ï¼ç¶åå°è½¬æ¢åçæ°æ®ä¼ éç»éæ管ï¼è¿æ ·çè¿ç¨æ¯å¤å¶æ°æ®çè¿ç¨ãäºæä½çæ°æ®å°éåºæ¬ä¸å°±æ¯è¿ä¸¤ç§ï¼1æ°æ®çå¤å¶å°éï¼2æ°æ®çå åå°åå°éï¼
ä¸é¢æ们ç¨ä¸å¯å¾æ¥è¡¨è¾¾æä¸é¢æ说çåçã
2ï¼
å¦ææ管çæ°æ®ç±»åä¸éæ管çæ°æ®ç±»åå¨å åä¸æ¯çä»·çï¼é£ä¹CLRè¿è¡å°éçæ¹å¼ä¼å¾ç®åãå¦ææ管çæ°æ®ç±»åä¸éæ管çæ°æ®ç±»åæ¯ä¸çä»·çï¼é£ä¹CLRä¼è¿è¡ç¸åºå¤å¶è½¬æ¢æä½ï¼å½ç¶è¿æ ·ä¼ä¸¢å¤±æ°æ®å åæ³æ¼é½æ¯æå¯è½çï¼ä½æ¯æ们ä¸ç¨æï¼.NET为æ们å好äºå¾å¥½çäºæä½æ¡¥æ¢ï¼æ们åªè¦å¯¹è¦å°éçæ°æ®è¿è¡ä¸ç³»åç设置就è½å¾æåçè¿è¡æ°æ®å°éäºï¼
æ»ç»ï¼è¿ç¯æç« ä¸»è¦ç»å¤§å®¶ä»ç»ä¸ä¸ï¼å ³äºæ管ä¸éæ管çæ°æ®å°éç¸å ³çæ¦å¿µï¼ä¸é¢æ们å°å¦ä¹ äºæä½çæ°æ®å°éï¼
æ¬æåºèª âä¸æ³¨C#ã.NETâ å客ï¼è¯·å¡å¿ ä¿çæ¤åºå¤http://wangqingpei557.blog.51cto.com/1009349/603056
Â
Â
Â