在C#应用程序中从非托管DLL导入函数

时间:2010-12-14 20:17:56

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

我需要导入一个用C ++编写的函数,现在编译成一个DLL,放到我的C#应用​​程序中。所有内容都是在没有错误或警告的情况下构建的,但是当我单步执行代码时,第一个调用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组件。

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

2 个答案:

答案 0 :(得分:4)

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

在DLL上使用Dumpbin.exe / exports查看真实姓名。它应该是“?CreateScanEngine @@ YGXXZ”,使用[DllImport]属性中的EntryPoint属性。您可能还希望使用extern“C”声明该函数,因此不会发生此名称错误。

答案 1 :(得分:1)

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

尝试更改为:

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