Exporting functions from C++ dll to C# P/Invoke(将函数从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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:将函数从C++DLL导出到C#P/Invoke


- 在哪里可以找到使用中的C#/XML文档注释的好例子? 2022-01-01
- 带有服务/守护程序应用程序的 Microsoft Graph CSharp SDK 和 OneDrive for Business - 配额方面返回 null 2022-01-01
- Web Api 中的 Swagger .netcore 3.1,使用 swagger UI 设置日期时间格式 2022-01-01
- 良好实践:如何重用 .csproj 和 .sln 文件来为 CI 创建 2022-01-01
- C#MongoDB使用Builders查找派生对象 2022-09-04
- 如何用自己压缩一个 IEnumerable 2022-01-01
- 输入按键事件处理程序 2022-01-01
- WebMatrix WebSecurity PasswordSalt 2022-01-01
- C# 中多线程网络服务器的模式 2022-01-01
- MoreLinq maxBy vs LINQ max + where 2022-01-01