将函数从C++DLL导出到C#P/Invoke [英] Exporting functions from C++ dll to C# P/Invoke

查看:40
本文介绍了将函数从C++DLL导出到C#P/Invoke的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经构建了一个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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆