【问题标题】:Importing Function From Unmanaged DLL in C# Application在 C# 应用程序中从非托管 DLL 导入函数
【发布时间】:2010-12-14 20:17:56
【问题描述】:

我需要将我用 C++ 编写的函数导入到我的 C# 应用程序中,该函数现在已编译为 DLL。一切都在没有错误或警告的情况下构建,但是当我逐步执行代码时,对 DLL 的第一个函数调用会引发 Exception 并显示“无法在 DLL 'WMIQuery.dll'中找到名为'CreateScanEngine'的入口点”的消息。该函数在我的 C# 应用程序中声明如下:

internal static class WMIQuery
{
    [DllImport("WMIQuery.dll", CallingConvention = System.Runtime.InteropServices.CallingConvention.StdCall)]
    internal static extern void CreateScanEngine();
}

Dependency Walker 在 DLL 中显示该函数:

序数:1(0x0001)
提示:0(0x0000)
函数 ^: void CreateScanEngine(void)
入口点:0x00001860

Dependency Walker 还显示 DLL 的这些错误/警告:

错误:未找到至少一个必需的隐式或转发依赖项。
警告:至少没有找到一个延迟加载依赖模块。
警告:由于延迟加载依赖模块中缺少导出功能,至少有一个模块存在未解析的导入。

这会有所作为吗?另外,我尝试将 DLL 添加为对 C# 项目的引用,但出现此错误:

无法添加对 [我的 DLL] 的引用。请确保该文件是可访问的,并且它是一个有效的程序集或 COM 组件。

有谁知道我做错了什么?谢谢。

【问题讨论】:

    标签: c# c++ visual-studio-2008 dllimport dll


    【解决方案1】:

    不要使用 Dependency Walker,它会解开函数的导出名称,并且不会告诉您真正的导出名称。请注意,它足够聪明,可以看到它不接受参数并且没有返回值。只有当它看到 C++ 编译器修饰的名称时,它才能这样做。

    使用 DLL 上的 Dumpbin.exe /exports 查看真实名称。它应该是“?CreateScanEngine@@YGXXZ”,使用 [DllImport] 属性中的 EntryPoint 属性。您可能还想用 extern "C" 声明函数,这样就不会发生这种名称修改。

    【讨论】:

    • Dependency Walker 可以选择关闭名称修改。该选项的工具栏图标上写有 C++。
    • 我尝试按照您的建议添加extern "C" 以删除重整,但现在我收到编译器警告:warning C4297: 'CreateScanEngine' : function assumed not to throw an exception but does. The function is extern "C" and /EHc was specified. 什么是 /EHc 以及清除的正确方法是什么这个警告?谢谢。
    • 很好的警告。您不应在导出的函数中引发异常。没有人会捕捉到该异常,托管代码将使用异常消息进行轰炸,没有人知道如何排除故障,因为它不包含任何体面的信息。如果您想忽略这一点并关闭编译器,那么 Project + Properties, C/C++, Code Generation, Enable C++ Exceptions = /EHa.
    【解决方案2】:

    您如何在 C++ 代码中声明 CreateScanEngine?

    尝试更改为:

    extern "C" __declspec(dllexport) void __stdcall CreateScanEngine();
    

    【讨论】:

    • 我认为不需要但我添加了它
    • 我尝试添加 extern "C" 以消除重整,但现在我收到编译器警告:warning C4297: 'CreateScanEngine' : function assumed not to throw an exception but does. The function is extern "C" and /EHc was specified. 什么是 /EHc 以及清除此警告的正确方法是什么?谢谢。
    • @Jim: 移除异常抛出:)
    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-06
    • 2010-10-14
    相关资源
    最近更新 更多