【发布时间】:2010-10-08 23:29:43
【问题描述】:
我已经构建了一个我想从 C# 代码调用的 C++ dll。我可以调用一个函数,但是当 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 -“在 PInvoke DLL 'PPPManager.dll' 中找不到入口点 'PPPConnect'。”
我已经尝试从 Install 函数声明中删除 extern 和 declspec 指令,这样 PPPConnect 是唯一导出的函数,这仍然不允许我调用 PPPConnect。
我也尝试过按序号进行 DllImport;这与按名称调用的结果相同 - 安装返回,但 PPPConnect 抛出异常“找不到入口点 '#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 未传播到设备。哦!
【问题讨论】:
-
我从未听说过这个互操作日志 - 如何启用/查看它?
-
blogs.msdn.com/netcfteam/archive/2005/07/24/442609.aspx 我刚开始使用它来尝试调试这个问题,但它似乎可以为我节省大量调试 MissingMethodExceptions 的时间。
标签: c# c++ dll pinvoke dllimport