extern "C" __declspec(dllexport) int __stdcall add(int x, int y) { return x + y; }
extern "C" __declspec(dllexport)
extern "C"使得在C++中使用C編譯方式成為可能。在“C++”下定義“C”函數,需要加extern “C”關鍵詞。用extern "C"來指明該函數使用C編譯方式。輸出的“C”函數可以從“C”代碼裡調用.
使用微軟專用的_declspec (dllexport)
cpp文件在編譯為OBJ文件時要對函數進行重新命名,C語言會把函數name重新命名為_name,而C++會重新命名為_name@@decoration,
extern "C"表示用C語言的格式將函數重命名
要輸出整個的類,對類使用_declspec(_dllexpot);要輸出類的成員函數,則對該函數使用_declspec(_dllexport)
__stdcall 限定修飾符需要添加。不加這個限定符,不能成功調用,不知道為什麼??
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices;// public class DLL { [DllImport("DLLCpp.dll", EntryPoint = "add")] public extern static int add(int x, int y);//與dll中一致 } namespace DLLTest { class Program { static void Main(string[] args) { int ret = DLL.add(2, 3); Console.WriteLine(ret); Console.ReadKey(); } } }
using System.Runtime.InteropServices;
一般用到其中的DllImport,它用來調用windows中一些DLL的函數(Windows API),或調用自己用c++寫的DLL中的函數
public class DLL
{
[DllImport("DLLCpp.dll", EntryPoint = "add")]
public extern static int add(int x, int y);//與dll中一致
}
注意:c#如果是64位的環境,c++封裝動態庫的時候,設置為x64。 32位為什麼不能調用,還不清楚?