首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 呼叫非託管 DLL 實戰(二):編譯執行 InvokeDll、extern "C" 修飾導出函數名稱、EntryPointNotFoundException 錯誤分析

     編輯:關於C語言

編譯與執行步驟


C:\> csc InvokeDll.cs
Microsoft (R) Visual C# .Net Compiler version 7.10.3052.4
... 生成 InvokeDll.exe

C:\> InvokeDll
40

執行前確保 MyLib.dll 位於可載入路徑(同目錄或 PATH)。

extern "C" 的關鍵作用

C++ 編譯器預設會對函數名進行名稱修飾(如 ?add@@YAHHH@Z),導致 DllImport 依名稱 "add" 找不到入口點,拋出 EntryPointNotFoundException。


// MyLib.cpp
extern "C" __declspec(dllexport) int add(int a, int b) { return a + b; }

加上 extern "C" 強制使用 C 語言連結慣例,導出名稱即為 "add",C# 即可正確繫結。

後續課題

  • 無 extern "C" 時如何透過修飾名稱呼叫?
  • 參數為指標、結構體等複雜類型時的封送處理。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved