c#的dllimport 是为了调用C++编写的接口而提供的功能。
1. c#的项目平台和DLL的平台要匹配,比如x86 => x86, 而不能x64 => x86 或者 Any cpu => x86
2. 在声明接口的时候,要注意函数调用协议要匹配,
如果出先堆栈奔溃,则需要调整调用约定,比如:
[DllImport("somedll.dll", EntryPoint = "?TestFunc@JUOJYWER@Z", CallingConvention = CallingConvention.Cdecl)]
private extern static bool TestFunc();
这里指定了调用约定是Cdecl,和模块提供的接口的调用约定保持一致。
3. EntryPoint是为了指定接口的原始函数名,上面的TestFunc 的EntryPoint 为?TestFunc@JUOJYWER@Z,如果不指定的话,会出现找不到函数。可以使用IDA或者16进制编辑器找到真实的函数名。