2010-12-14 116 views
1

我需要将我用C++编写的函数导入到C#应用程序中,并将其编译为DLL。所有内容都没有错误或者警告,但是当我单步执行代码时,第一个调用DLL的函数会抛出一个Exception,并显示消息“无法在DLL'WMIQuery.dll'中找到名为'CreateScanEngine'的入口点。”函数声明像这样在我的C#应用​​程序:从C#应用程序中的非托管DLL导入函数

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

的Dependency Walker显示功能存在的DLL这样:

Ordinal: 1(0x0001)
Hint: 0(0x0000)
Function ^: void CreateScanEngine(void)
Entry Point: 0x00001860

Dependency Walker中也显示了这些错误/警告的DLL:

Error: At least one required implicit or forwarded dependency was not found.
Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

这会有所作为吗?另外,我尝试添加DLL作为C#项目的参考,并且出现此错误:

A reference to [my DLL] could not be added. Please make sure that the file is accessible, and that it is a valid assembly or COM component.

有人知道我在做什么错吗?谢谢。

回答

4

不要使用Dependency Walker,它会取消导出函数的名称并且不会告诉您真实的导出名称。请注意,它足够聪明,可以看到它没有参数并且没有返回值。它只能在C++编译器看到名称时才能做到这一点。

使用DLL上的Dumpbin.exe/exports来查看真实姓名。它应该是“?CreateScanEngine @@ YGXXZ”,使用[DllImport]属性中的EntryPoint属性。你可能也想用extern“C”声明该函数,所以这个名字不会发生变化。

+0

Dependency Walker中有一个选项可以关闭名字改编。该选项的工具栏图标上写有C++。 – Dialecticus 2010-12-14 20:40:42

+0

我试着添加'extern“C”'来移除mangling,正如你所建议的那样,但现在我得到了一个编译器警告:'警告C4297:'CreateScanEngine':函数假定不会抛出异常但是确实如此。该函数是extern“C”和/ EHc被指定的。什么是/ EHc和什么是清除此警告的正确方法?谢谢。 – 2010-12-15 15:13:41

+0

不错的警告。您不应该在导出的函数中抛出异常。没有人会捕捉到这个异常,托管代码会弹出一个异常消息,指出没人会知道如何进行故障排除,因为它没有任何像样的信息。如果你想忽略这个并关闭编译器,那么Project + Properties,C/C++,Code Generation,Enable C++ Exceptions =/EHa。 – 2010-12-15 15:47:20

1

你是如何在你的C++代码中声明CreateScanEngine的?

尝试改用:

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

__stdcall丢失。 – 2010-12-14 20:36:47

+0

我不认为这是必要的,但我添加了它 – 2010-12-14 20:43:33

+0

我试着添加'extern“C”'来删除mangling,但现在我得到一个编译器警告:'警告C4297:'CreateScanEngine':函数假定不是抛出一个例外,但是。该函数是extern“C”和/ EHc被指定的。什么是/ EHc和什么是清除此警告的正确方法?谢谢。 – 2010-12-15 15:14:12