从AnyCPU更改为x86会导致System.BadImageFormatException错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从AnyCPU更改为x86会导致System.BadImageFormatException错误相关的知识,希望对你有一定的参考价值。

我创建了一个WinForms UserControl。

当我离开平台到AnyCPU时,我可以毫无问题地调试它:当我按下播放时,预览会出现。

然后我尝试将项目更改为x86。因此,我单击“AnyCPU”,然后单击“Configuration Manager”。

在“Active project platform”中,我选择“New ...”。

现在我选择“x86”并单击“确定”。

然后,当我单击“播放”时,我收到错误“System.BadImageFormatException”。

这是一个常见问题,还是我系统上的一些非常非常错误的问题?

每次我尝试使用新项目时都会发生这种情况。

enter image description here

enter image description here

enter image description here

答案

我可以通过以下方式重现您在VS 2017 15.9.8中找到的错误:

  • 创建新的(VB或C#)Windows窗体控件库
  • 检查它是否通过默认的AnyCpu解决方案平台运行
  • 创建新的x86解决方案平台
  • 尝试并运行该项目

当您在Visual Studio中调试WindowsFormsControlLibrary时,您的DLL通过调试主机“UserControlTestContainer.exe”加载,该主机是为“AnyCpu(64位首选)”构建的。

右键单击正在运行的调试主机的任务栏,右键单击其图标,选择“属性”以查找其路径,然后传递给,例如,可以找到详细信息。 ILSpy。

所以我认为当调试主机运行为64位,并通过32位dll加载时,位数causes Assembly.LoadFrom to fail不匹配。

[编辑]

这似乎是一个错误,因为它阻止(轻松)调试具有x86的依赖项(例如非托管代码)的WinForms控件库。

但我怀疑WinForms调试x86的问题只是VS团队会优先考虑的事情。

作为一种解决方法,您可以编写自己的测试容器(!)或:

  • 以admin身份启动VS命令提示符
  • 制作UserControlTestContainer.exe的副本
  • 使用corflags /32bitreq+ /32bitpref+ <PathToExe>将副本设置为以x86运行
  • 在调试选项中将副本设置为“启动外部程序”目标
  • 将dll的路径设置为debug命令行参数
另一答案

这是一个常见问题,通常意味着您尝试从32位可执行文件调用64位库。编译x86时,请确保使用32位库。

以上是关于从AnyCPU更改为x86会导致System.BadImageFormatException错误的主要内容,如果未能解决你的问题,请参考以下文章

从 varchar 更改为 mediumtext 会导致性能下降

如何知道在构建中使用哪个 cpu(x86 x64 或 AnyCpu)?

将 x86 更改为 x64 会影响我的 LNK1168 错误

将数据类型从int更改为time会导致现有值出错

『开源重编译』System.Data.SQLite.dll 自适应 x86 x64 AnyCPU 重编译

从 AfxGetAppModuleState 更改为 AfxGetStaticModuleState 会导致链接器错误:LNK1169:找到一个或多个多重定义的符号