问题:
在使用C#的DllImport调用C++编写的类库dll时候,出现找不到函数入口点。
C++的dll函数名
#ifdef DLLCLASS_EXPORT
#define EXT_CLASS __declspec(dllexport)
#else
#define EXT_CLASS _declspec(dllimport)
#endif
extern "C" EXT_CLASS class CBaseInterface
{
public:
virtual int SetParameter(unsigned char ucIPAddr[4], unsigned short usPort) = 0;
virtual int OpenBoard() = 0;
virtual int CloseBoard() = 0;
virtual int ReadRegisterUlong(unsigned int uiOffset, unsigned int* puiData) = 0;
virtual int WriteRegisterUlong(unsigned int uiOffset, unsigned int uiData) = 0;
};
我C#调用:
[DllImport(@"SignalProbeDevice.dll", EntryPoint = "CDeviceInterface")]
static extern int OpenBoard();
找了很久,觉得没有问题,使用VS自带的工具dumpbin.exe查看一下,封装的dll的函数的名称。
dumpbin.exe在VS安装目录下,我安装的是Visual Studio 2019 Community版本,我的路径参考如下:
D:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\bin\Hostx64\x64
如何使用dumpbin.exe查看封装好的dll的函数名:
有同学反映使用dumpbin.exe会闪退,是因为不能直接点开输入指令,而是应该从系统cmd启动。
方法如下:
然后输入指令:
dumpbin -exports (dll的路径)
如:
结果:
此时发现了问题,我的函数名OpenBoard变成了?OpenBoard@NETBInterface@@UEAAHXZ,
解决:
我改了函数入口,重新调用,即OK:
[DllImport(@"SignalProbeDevice.dll", EntryPoint = "?OpenBoard@NETBInterface@@UEAAHXZ")]
static extern int OpenBoard();
以上方法,修改了C#调用的EntryPoint,实现了正常调用。