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

时间:2019-04-14 22:55:30

标签: vb.net winforms visual-studio-2017

我已经创建了WinForms UserControl。

当我将平台留在AnyCPU上时,可以毫无问题地对其进行调试: 当我按Play时,将显示预览。

然后我尝试将项目更改为x86。 因此,我单击“ AnyCPU”,然后单击“配置管理器”。

在“活动项目平台”上,选择“新建...”。

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

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

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

每次我尝试一个新项目时都会发生。

enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

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

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

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

您可以通过右键单击正在运行的调试主机的任务栏,右键单击其图标,选择 Properties 来找到其路径,然后传递到例如ILSpy。

因此,我认为当调试主机以64位运行并传递32位dll进行加载时,位javascript的不匹配。

[编辑]

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

但是我怀疑VS团队会优先考虑WinForms仅用于x86的调试问题。

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

  • 以管理员身份启动VS命令提示符
  • 复制UserControlTestContainer.exe
  • 使用causes Assembly.LoadFrom to fail将副本设置为以x86运行
  • 在调试选项中将副本设置为“启动外部程序”目标
  • 将dll的路径设置为调试命令行参数

答案 1 :(得分:-1)

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