【问题标题】:how to call a C++ dll from C# windows application project如何从 C# windows 应用程序项目中调用 C++ dll
【发布时间】:2019-03-07 09:35:38
【问题描述】:

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

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

TestClient.exe 中出现“System.BadImageFormatException”类型的未处理异常 附加信息:试图加载格式不正确的程序。 (HRESULT 异常:0x8007000B)

我能知道如何避免这个问题吗?

提前致谢!

【问题讨论】:

  • 您发布了结果(异常)但没有发布原因(您的源代码)。

标签: c# exception visual-c++ dllimport


【解决方案1】:

此错误表示您正在尝试将 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 位运行。因此,您将需要 32 位和 64 位版本的本机 DLL。

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

【讨论】:

  • 我使用的是 64 位机器。但是所有的项目都是32位平台,我什至不能改变C++ dll项目中的平台目标,除了“Win 32”。在 C# 项目属性中,构建目标也只能设置为“任何 CPU”。但是,我设法从 C# Web 服务访问 dll 方法。我在使用 C# windows 应用程序时遇到了这个问题。
  • 为什么不能从 AnyCPU 更改 C# 项目?这是一个什么样的项目? 64 位机器上的 AnyCPU 项目将以 64 位运行。当它尝试加载您的 Win32(32 位)C++ DLL 时,它将失败,并出现您看到的异常。您应该将 C# 项目更改为 x86 或将 C++ DLL 项目更改为 x64。
  • 对不起。我似乎看错了地方。是的,我可以在 C# 中将平台更改为 x86,所以现在不会引发异常。非常感谢:)
  • 使用 c++/cli 创建一个包装器并从 cli 包装器调用未管理的代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多