C#是运行在CLR之上被托管的,而C++则并没有被托管。
目前.Net平台中托管环境调用非托管环境有三种方法:
①P/Invoke
②C++ Interop
③COM Interop
这三种方法当中,C++ Interop是针对托管C++使用的方法(微软自己弄的一套C++,语法和传统c++很不一样),COM Interop则是针对Window软件开发而采用的方式。所以我们只剩下一种解决方案:也就是PInvoke来进行托管环境与非托管环境的互操作。
在c++中这样写:
_declspec(dllexport) int add (int a, int b)
{
return a + b;
}
_declspec(dllexport) int subtract (int a, int b)
{
return a - b;
}
__declspec(dllexport)代表需要导出的函数,需要放在函数定义的前面。
在c#中这些写:
using System.Runtime.InteropServices;
[DllImport("use_c++.dll",EntryPoint = "?add@@YAHHH@Z")]
public static extern int add(int x, int y);
c++编译器为了支持重载,所以在编译的时候给每一个接口都重新定义了唯一的名字,这个过程被称为“名字粉碎”。这个名字就是dll找到接口的入口地址。
?我们使用vs自带的工具d