我需要导入一个用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组件。
有谁知道我做错了什么?感谢。
答案 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();