C#ä¸C++交äºï¼æ»ä½æ¥è¯´å¯ä»¥æ两ç§æ¹æ³ï¼
å©ç¨C++/CLIä½ä¸ºä»£çä¸é´å±
å©ç¨PInvokeå®ç°ç´æ¥è°ç¨
第ä¸ç§æ¹æ³ï¼å®ç°èµ·æ¥æ¯è¾ç®åç´è§ï¼å¹¶ä¸å¯ä»¥å®ç°C#è°ç¨C++æåçç±»ï¼ä½æ¯é®é¢æ¯MONOææ¶ä¸æ¯æC++/CLIåè½ï¼å æ¤æ æ³å®ç°è±ç¦»Microsoft .NET Framework跨平å°è¿è¡ã
第äºç§æ¹æ³ï¼ç®åçå®ç°å¹¶ä¸éº»ç¦ï¼åªè¦æ·»å DllImportAttributeç¹æ§å³å¯ä»¥å¯¼å
¥C/C++çå½æ°ï¼ä½æ¯é®é¢æ¯PInvokeä¸è½ç®åçå®ç°å¯¹C++ç±»çè°ç¨ãå¨Warensoft3Dä¸ä¸ºäºå¯ä»¥ä½¿ç¨MONOå®ç°è·¨å¹³å°ï¼å½ç¶DirectXæ¯ä¸è½è·¨å¹³å°çï¼ï¼æ以使ç¨äºæ¬æ¹æ³ï¼ä¸é¢å°å¯¹æ¬æ¹æ³å±å¼è¯¦ç»ç说æã
æµè¯å¹³å°ï¼
Windows7 64ä½ï¼VS2010ï¼.NET4.0
注æäºé¡¹ï¼
PInvokeä»åè½ä¸æ¥è¯´ï¼åªæ¯æå½æ°è°ç¨ï¼å¨è¢«å¯¼åºçå½æ°åé¢ä¸å®è¦æ·»å extern "C"æ¥ææ导åºå½æ°çæ¶å使ç¨Cè¯è¨æ¹å¼ç¼è¯åè¿æ¥ï¼è¿æ ·ä¿è¯å½æ°å®ä¹çååå导åºçååç¸åï¼å¦åå¦æé»è®¤æC++æ¹å¼å¯¼åºï¼é£ä¸ªå½æ°çååå°±ä¼åå¾ä¹±ä¸å
«ç³ï¼æ们çç¨åºå°±æ æ³æ¾å°å
¥å£ç¹äºã
æ¬æå°è¯´æ以ä¸å ç¹ï¼
äºè°çåºæ¬åç
åºæ¬æ°æ®ç±»åçä¼ é
æéçä¼ é
å½æ°æéçä¼ é
ç»æä½çä¼ é
äºè°çåºæ¬åç
é¦å
ï¼æ们æ¥çä¸ä¸ªå常è§ä¸è¿çæ¦å¿µâ"æ°æ®ç±»å"
æ们ç¥éå¨å¤§å¤æ°çéæè¯è¨ä¸å®ä¹åéçæ¶åé½è¦å
æå®å
¶æ°æ®ç±»åï¼æè°æ°æ®ç±»åï¼é½æ¯äººä»¬å¼ºå çä¸ä¸ªä¾¿äºè®°å¿çå称ï¼ç©¶å
¶æ¬è´¨å°±æ¯ææäºè¿ä¸ªæ°æ®å¨å
åéå°åºæ¯å ç¨äºå 个åèï¼ç¨åºå¨è¿è¡çæ¶åï¼é¦å
æ¾å°è¿ä¸ªæ°æ®çå°åï¼ç¶ååæç该类åçé¿åº¦ï¼è¯»åç¸å¯¹åºçå
åï¼ç¶ååå¤çã
äºè§£äºåé¢è¿ä¸ªäºå¿ï¼ææç¼ç¨è¯è¨ä¹é´è¿è¡äºè°å°±æç¹é¨éå¿äºã对äºä¸åè¯è¨ä¹é´çäºè°ï¼åªè¦å°è¯¥æ°æ®çæéï¼å
åå°åï¼ä¼ éç»å¦ä¸ä¸ªè¯è¨ï¼å¨å¦ä¸ä¸ªè¯è¨ä¸æ ¹æ®éä¿¡åè®®å°æéææåçæ°æ®åå¨å
¥é¿åº¦å¯¹åºçæ°æ®ç±»åå³å¯ï¼å½ç¶è¦æ»¡è¶³ä»¥ä¸å ç¹ï¼
对äºåJavaï¼.NETè¿æ ·æè¿è¡æ¶èææºç¼ç¨è¯è¨æ¥è®²ï¼ç±äºèææºä¼è®©å å
åæ¥å转移ï¼å æ¤ï¼å¨è¿è¡äºè°çæ¶åï¼è¦ä¿è¯æ£å¨è¢«äºè°çæ°æ®æå¨çå
åä¸å®è¦åºå®ï¼ä¸è½è¢«è½¬ç§»ã
æä¸äºç¼ç¨è¯è¨æ¯ææéï¼æä¸äºè¯è¨ä¸æ¯ææéï¼å¦Javaï¼ï¼è¿ä¸ªé®é¢å¹¶ä¸éè¦ï¼æè°æéï¼å
¶å®å°±æ¯ä¸ä¸ªå
åå°åï¼å¯¹äº32ä½OSçæéæ¯ä¸ä¸ª32ä½æ´æ°ï¼è对äº64ä½æºOSçæéæ¯ä¸ä¸ª64ä½æ´æ°ãå 为大å¤æ°è¯è¨ä¸é½ææ´åæ°ï¼æ以å¯ä»¥å©ç¨æ´åæ¥æ¥æ¶æéã
åºæ¬æ°æ®ç±»åçä¼ é
äºè°è¿ç¨ä¸ï¼æåºæ¬è¦ä¼ éçæ éæ¯æ°å¼åå符ï¼å³ï¼int,long,float,charççï¼ä½æ¯æ¤ç±»åé彼类åï¼C/C++ä¸C#ä¸æä¸äºæ°æ®ç±»åé¿åº¦æ¯ä¸ä¸æ ·çï¼ä¸è¡¨ä¸ååºå¸¸è§æ°æ®ç±»åçå¼åï¼
C/C++
C#
é¿åº¦
short
short
2Bytes
int
int
4Bytes
long(该类åå¨ä¼ éçæ¶å常常ä¼å¼æ··)
int
4Bytes
bool
bool
1Byte
char(Asciiç å符)
byte
1Byte
wchar_tï¼Unicodeå符ï¼è¯¥ç±»åä¸C#ä¸çCharå
¼å®¹ï¼
char
2Bytes
float
float
4Bytes
double
double
8Bytes
æ容æå¼æ··çæ¯å°±æ¯long,char两个类åï¼å¨C/C++ä¸longåinté½æ¯4个åèï¼é½å¯¹åºçC#ä¸çintç±»åï¼èC/C++ä¸çcharç±»åå ä¸ä¸ªåèï¼ç¨æ¥è¡¨ç¤ºä¸ä¸ªASCIIç å符ï¼å¨C#ä¸è½å¤è¡¨ç¤ºä¸ä¸ªåèçæ¯byteç±»åãä¸C#ä¸charç±»å对åºçåºè¯¥æ¯C/C++ä¸çwchar_tç±»åï¼å¯¹åºçæ¯ä¸ä¸ª2åèçUnicodeå符ã
ä¸é¢éè¿å®ä¾æ¥è¯´æè°ç¨è¿ç¨ï¼
第ä¸æ¥ï¼
建ç«ä¸ä¸ªC++çWin32DLLï¼å¦ä¸å¾æ示ï¼
è¿éè¦æ³¨æéæ©"Export symbols"导åºç¬¦å·ãç¹å»å®æã
第äºæ¥ï¼
ç±äºé¡¹ç®çå称æ¯"TestCPPDLL"ï¼å æ¤ï¼ä¼èªå¨çæTestCPPDLL.håTestCPPDLL.cpp两个æ件ï¼.hæ件æ¯è¦å¯¼åºå
容ç声ææ件ï¼ä¸ºäºè½æ¸
æ¥ç说æé®é¢ï¼æ们å°TestCPPDLL.håTestCPPDLL.cpp两个æ件ä¸çææå
容é½å é¤ï¼ç¶åå¨TestCPPDLL.hä¸æ·»å å¦ä¸å
容ï¼
第ä¸è¡ä»£ç ä¸å®ä¹äºä¸ä¸ªå为"TESTCPPDLL_API"çå®ï¼è¯¥å®å¯¹åºçå
容æ¯"__declspec(dllexport)"æææ¯å°åé¢ä¿®é¥°çå
容å®ä¹ä¸ºDLLä¸è¦å¯¼åºçå
容ãå½ç¶ä½ ä¹å¯ä»¥ä¸ä½¿ç¨è¿ä¸ªå®ï¼å¯ä»¥ç´æ¥å°"__declspec(dllexport)"åå¨è¦å¯¼åºçå½æ°åé¢ã
第äºè¡ä¸ç"EXTERN_C"ï¼æ¯å¨"winnt.h"ä¸å®ä¹çå®ï¼å¨å½æ°åé¢æ·»å "EXTERN_C"çåäºå¨å½æ°åé¢æ·»å extern "C",æææ¯è¯¥å½æ°å¨ç¼è¯åè¿æ¥æ¶ä½¿ç¨Cè¯è¨çæ¹å¼ï¼ä»¥ä¿è¯å½æ°ååä¸åã
第äºè¡ç代ç æ¯ä¸ä¸ªå½æ°ç声æï¼è¯´æ该å½æ°å¯ä»¥è¢«æ¨¡åå¤é¨è°ç¨ï¼å
¶å®ä¹å®ç°å¨TestCPPDLL.cppä¸ï¼TestCPPDLL.cppç代ç å¦ä¸æ示ï¼
第ä¸æ¥ï¼
å¨ç¼è¯C++DLLä¹åï¼éè¦å以ä¸é
ç½®ï¼å¨é¡¹ç®å±æ§å¯¹è¯æ¡ä¸éæ©"C/C++"|"Advanced"ï¼å°Compile AS é项çå¼æ¹ä¸º"C++"ãç¶åç¡®å®ï¼å¹¶ç¼è¯ã
çæçDLLæ件å¦ä¸å¾æ示ï¼
第åæ¥ï¼
é¦å
ï¼æ·»å ä¸ä¸ªC#çåºç¨ç¨åºï¼å¦æè¦å¨C#ä¸è°ç¨C++çDLLæ件ï¼å
è¦å¨C#çç±»ä¸æ·»å ä¸ä¸ªéææ¹æ³ï¼å¹¶ä¸ä½¿ç¨DllImportAttribute对该æ¹æ³è¿è¡ä¿®é¥°ï¼ä»£ç å¦ä¸æ示ï¼
DllImportä¸ç第ä¸ä¸ªåæ°æ¯ææDLLæ件çä½ç½®ï¼ç¬¬äºä¸ªåæ°"EntryPoint"ç¨æ¥ææ对åºçC/C++ä¸çå½æ°å称æ¯ä»ä¹ã"extern"å
³é®å表æ该å¤å£°æçè¿ä¸ªAddæ¹æ³æ¯ä¸ä¸ªå¤é¨è°ç¨ã
该æ¹æ³å£°æå®æ¯ä¹åï¼å°±å¯ä»¥åè°ç¨ä¸ä¸ªæ®éçéææ¹æ³ä¸æ ·å»ä½¿ç¨äºã
ä¸é¢æ¯ç¤ºä¾ç¨åºï¼
温馨提示:答案为网友推荐,仅供参考