2010-05-28 93 views
3

我在Visual Studio中使用类库项目在C++中创建了一个dll。我需要从C#应用程序调用dll中的方法。如何从C#窗口应用程序项目调用C++ dll

我知道有两种方法。一种是将dll项目引用添加到C#项目或使用DllExport导出方法。但是,当我尝试两种方式时,它总是给运行时调用dll方法时出现以下错误。

TestClient.exe中发生未处理的类型为'System.BadImageFormatException'的异常 附加信息:试图加载格式不正确的程序。 (从HRESULT异常:0x8007000B)

我可以知道如何避免此问题?

在此先感谢!

+0

您发布了结果(例外),但不是原因(您的源代码)。 – 2010-05-28 10:45:39

回答

5

此错误意味着您正试图将32位DLL加载到64位进程或64位DLL中加载到32位进程中。在Windows上,DLL的位数必须与进程的位数相匹配才能正确加载。

您的本地DLL是32位还是64位?在您的C#项目构建设置中,您定位的是哪个平台?如果您进入C#项目属性,您可以转到“构建”选项卡并将“平台目标”更改为x86或x64等特定项目,以与您的本机DLL的平台相匹配。

另一种方法是构建本机DLL以匹配C#应用程序的平台。但是,如果C#应用程序的平台是AnyCPU,则它将在32位Windows上运行为32位,在64位Windows上运行为64位。因此,您将需要本地DLL的32位和64位版本。

我建议您将C#应用程序的平台设置为特定的(x86,x64),然后更改您的本机DLL的平台以匹配。

+0

我使用64位机器。但所有的项目都在32位平台上,除了“Win 32”以外,我甚至无法更改C++ dll项目中的平台目标。在C#项目属性中,构建目标只能设置为“任何CPU”。 但是我设法从C#web服务访问dll方法。使用C#windows应用程序时遇到此问题。 – chathuradd 2010-05-28 11:29:44

+0

为什么不能从AnyCPU更改C#项目?它是一个什么样的项目? 64位机器上的AnyCPU项目将以64位运行。当它试图加载你的Win32(32位)C++ DLL时,它会失败,除了你看到的例外。您应该将C#项目更改为x86或将C++ DLL项目更改为x64。 – 2010-05-28 11:39:48

+0

对不起。我似乎看错了地方。是的,我可以在C#中将平台更改为x86,因此现在不会引发异常。 非常感谢:) – chathuradd 2010-05-28 12:21:13