问题描述
我已经构建了一个C++DLL,我想从C#代码中调用它。我可以调用一个函数,但当C#代码尝试加载DLL时,另一个函数会抛出异常。
标题如下:
extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
这会生成一个导出表有些混乱的DLL(在名称字段中foo=foo是什么意思?):
File Type: DLL
Section contains the following exports for PPPManager.dll
00000000 characteristics
499F44F0 time date stamp Fri Feb 20 16:04:00 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 000078E4 Install = Install
2 1 000079DC PPPConnect = PPPConnect
我的P/Invoke声明如下:
[DllImport("PPPManager.dll")]
private static extern bool Install();
[DllImport("PPPManager.dll")]
private static extern bool PPPConnect();
Install调用返回时没有异常,但当我调用PPPConnect时,我得到一个MissingMethodException-"Can‘t Find an Entry Point’PPPConnect‘in a PInvoke Dll’PPPManager.dll‘。"
我已尝试从Install函数声明中删除extern和declspec指令,以便PPPConnect是唯一导出的函数,但这仍然不允许我调用PPPConnect。
我也尝试过按序号执行DllImport;这会产生与按名称调用相同的结果--安装返回,但PPPConnect抛出异常"Can‘t Find a Entry Point’#2‘..."。
互操作日志提供:
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::Install();
BOOLEAN (I1_WINBOOL_VAL) Install();
JIT ERROR FOR PINVOKE METHOD (Managed -> Native):
[pinvokeimpl][preservesig]
bool invivodata.Common.System.IPAQUtils::PPPConnect();
BOOLEAN (I1_WINBOOL_VAL) PPPConnect();
这完全超出了我的专业领域,因此欢迎您提出任何建议或想法。
谢谢, 保罗
编辑: 事实证明,该代码确实起作用了;问题是最新的DLL没有传播到设备。哦!
dll
您是否在推荐答案项目中使用.def文件来导出这些函数?如果是,请将其删除,然后重试。这只是一种猜测,因为当您执行外部"C"解密规范(Dllexports)时,您的导出似乎不是它们应有的状态。
我使用一个简单的C++DLL
尝试了这一点extern "C" __declspec(dllexport) BOOL Install();
extern "C" __declspec(dllexport) BOOL PPPConnect();
和一个使用PInvoke声明的简单C#应用程序,运行正常。
当我在DLL上执行转储/导出时,我看到:
转储文件PPPManager.dll
文件类型:Dll
部分包含PPPManager.dll的以下导出
00000000 characteristics
499F6C2D time date stamp Fri Feb 20 20:51:25 2009
0.00 version
1 ordinal base
2 number of functions
2 number of names
ordinal hint RVA name
1 0 000110CD Install = @ILT+200(_Install)
2 1 00011069 PPPConnect = @ILT+100(_PPPConnect)
请注意,导出的名称在我的大小写中不同。
这篇关于将函数从C++DLL导出到C#P/Invoke的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!