从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”。
这是一个常见问题,还是我系统上的一些非常非常错误的问题?
每次我尝试使用新项目时都会发生这种情况。
我可以通过以下方式重现您在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 错误
『开源重编译』System.Data.SQLite.dll 自适应 x86 x64 AnyCPU 重编译
从 AfxGetAppModuleState 更改为 AfxGetStaticModuleState 会导致链接器错误:LNK1169:找到一个或多个多重定义的符号