【发布时间】:2015-04-09 01:29:03
【问题描述】:
这是确切的场景。我有一个来自第三方供应商的 x86 程序集,我想与 NServiceBus 一起使用。但是,当 NServiceBus 尝试扫描程序集时,我很快就会得到一连串的 BadImageFormat 异常。这是我可以通过使用 x86 版本的 NServiceBus 来解决的问题,但是我必须更改所有其他引用的库以执行相同的操作,其中一些依赖于 x64 程序集。
我能想到的最干净的解决方案是使用 corflags.exe 将第三方程序集修改为 AnyCPU。这样我就不必将许多其他引用的库中的任何一个修改为 x86。到目前为止,这一切正常。
但是,我被警告过,如果第三方库引用了在 x86 和 x64 中具有不同实现的任何库,这可能会成为问题。
所以我的问题是,x86 和 x64 .NET Framework 库的 IL 有什么区别,例如 System.* x64 的 IL 是否等于 System.* x86 的 IL?
据我所知,平台目标只是开发人员设置的首选项,不会影响实际生成的 IL;只要 .NET Framework 在其 x64 和 x86 程序集中也使用相同的 IL,我使用 corflags.exe 转换第三方程序集的解决方案应该是安全的。是这样吗?
每个评论问题:第三方库引用(我通过反编译第三方库知道这一点。)
- 系统
- System.Runtime.Serialization
- System.Runtime.Serialization
- mscorlib
- (它们的依赖项)
所有版本都是 4.0.0.0。
【问题讨论】:
-
您被警告说第三方库可能存在问题,然后您询问 System.Collections。 System.Collections 第三方库适合你吗???
-
你不能将项目解决方案更改为
AnyCPU与使用corflags.exe 以及你在4.0 或4.5 下运行项目的.net 版本吗? -
@MethodMan:不。如果我将项目解决方案更改为 x86 以外的任何内容,我会收到 BadImageFormat 异常。我在 .NET 4.5 下运行该项目。
-
@mybirthname:我被警告过,通常使用 corflags 将 x86 程序集转换为 x64 程序集可能会导致问题。 System.Collections 程序集就是一个例子。但是根据您的评论,我已经编辑了问题以包括第三方库根据 JustDecompile 实际引用的库。另外,我要强调的是,它是由私人供应商提供的第三方 SDK 程序集,而不是 .NET 框架程序集。
-
请注意,微软目前的官方建议是始终使用
x86而不是AnyCPU(这就是为什么在VS2012 中更改了默认值)- 使用x64没有性能优势-值得一提的标记程序集和x86-标记程序集保持完全兼容性,并且没有获得您所看到的BadImageFormatException的风险。除非你真的需要 >2GB 的地址空间,否则我建议坚持使用x86。
标签: c# .net assembly implementation cil