我对Rx中一个相当简单的项目中遇到的异常感到困惑。
我用Google搜索BadImageFormatException
并发现在尝试将特定于平台的程序集加载到不兼容的进程时抛出它。
我的项目的平台设置是"任何CPU"但是,显然System.Reactive.Core.dll
本身也是如此。
堆栈跟踪的顶部位于Rx:
读取的来源
protected override void OnNextCore(T value)
{
_onNext(value);
}
_onNext
是Action<...>
。
我当前的问题是,我不知道如何确定哪个组件实际上无法加载 - 这些信息并非我得到的例外情况,而且我不知道从哪里得到它。
我不认为它实际上是关于Rx的,但它是什么?
任何想法?
编辑1:
这是fuslogvw在非调试器运行时的结果,设置为&#34;显示所有绑定&#34;,以及从异常中获取的堆栈跟踪。将fuslogvw设置为仅显示失败的绑定不会给我任何东西。
编辑2:
我也确定&#34;更喜欢32位&#34;在来自我的所有程序集中都设置为off,尤其是主控制台应用程序。
编辑3:
绝对令人困惑:我现在打破了解决方案,删除了所有依赖项,包括rx,并将源代码粘贴到新解决方案中,所有项目都直接从向导中移除 - 它仍在发生。
我在另外两台机器上试过了,还在发生。
这到底是什么意思??
我绝望,这里是来源。也许比我更聪明的人很好奇:
答案 0 :(得分:1)
我建议您下载Windows SDK并使用fuslogvw工具调试程序集绑定。
https://msdn.microsoft.com/en-us/library/ms717422(v=vs.110).aspx https://msdn.microsoft.com/en-us/library/e74a18c4(v=vs.110).aspx
答案 1 :(得分:1)
通常(我并不总是指),当程序集损坏或“位数”(即32位,64位)不同时,BadImageFormatException
会被抛出,换句话说,执行程序集是根据与正在加载的程序集不同的“位数”进行编译的。
在Visual Studio中,即使您选择了Any CPU
选项,也请检查Prefer 32 bit
是否已设置。可能是在您的应用程序中仍然存在32位和64位程序集的混合。
有关Prefer 32 bit
字段的详细信息,请参阅此处:
What is the purpose of the "Prefer 32-bit" setting in Visual Studio 2012 and how does it actually work?
检查程序集的另一种方法是下载并安装一个名为Assembly Information
的漂亮工具,它将告诉您有关.NET程序集的更多信息。