【问题标题】:.NET application is linking 64-bit DLLs instead of 32-bit like I want. Why?.NET 应用程序正在链接 64 位 DLL,而不是我想要的 32 位。为什么?
【发布时间】:2019-06-12 01:54:33
【问题描述】:

我采用了需要转换为 32 位的代码库(因此我可以使用外部 32 位驱动程序)。我将项目平台目标设置为 x86(下图)。这一切都编译得很好,但由于某种原因在运行时它崩溃并产生以下输出 An unhandled exception of type 'System.BadImageFormatException' occurred in mscorlib.dll

我使用了 Dependency Walker,发现其中一些链接的 DLL 是 64 位的,位于 \System32\ 当我想要位于“SysWOW64”中的 32 位 DLL 时。 (输出如下)。您可以从输出中看到目录不正确,并且它们确实是 64 位 DLL。我以为这都是windows管理的?

所以我的问题是,如何强制应用程序转到 \SysWOW64\ 中的 32 位 DLL?这是 Windows 配置设置还是项目设置?或者如何进一步诊断问题?

【问题讨论】:

  • 你为什么不为项目配置你的平台?
  • 愚蠢的问题,但你最后一次清理解决方案是什么时候?
  • 我已经多次清理和重建。 “你为什么不为项目配置你的平台?”我不确定你的意思。为什么我没有在显示“平台”的地方指定确切的 CPU 类型?
  • 这是一个什么样的项目? Asp.Net、WinForms、WPF、Service等……
  • 请注意,编译后的托管 dll 不包括本地 dll 的路径,而只包括其名称。

标签: c# .net windows dll


【解决方案1】:

我认为您需要将平台下拉菜单从 Active (Any CPU) 设置为 32 位。

Active solution platform VS Project Platform VS Platform target

根据以上所述,对于 Active(任何 CPU),组件将是 JIT 以适应其运行的平台,因此 x86 在 32 位平台上,x64 在 64 位平台上。

另外,可能需要配置 MSIL:

https://stackoverflow.com/a/10196549/1666620

  1. 转到构建|配置管理器菜单项。
  2. 在列表中找到您的项目,在平台下会显示“任何 CPU”
  3. 从下拉列表中选择“任何 CPU”选项,然后选择
  4. 在该对话框中,从“新平台”下拉菜单中选择 x86,并确保在“复制设置自”下拉菜单中选择“任何 CPU”。
  5. 点击确定
  6. 您需要为调试和发布配置选择 x86。

【讨论】:

  • 我刚试过,结果是一样的。
  • 如果您可以让解决方案中的所有项目与解决方案配置和平台目标相匹配,那就太好了,但这并不总是可行的。如果这是解决方案中唯一的项目,或者解决方案中的所有项目都需要这个位,那么 OP 应该强烈考虑这个建议,以使解决方案更容易理解。
猜你喜欢
  • 2013-09-14
  • 2011-03-03
  • 2020-07-18
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2011-04-09
  • 2010-10-31
相关资源
最近更新 更多