【问题标题】:Is there any difference in the IL of x86 vs x64 .NET Framework libraries?x86 与 x64 .NET Framework 库的 IL 有什么区别吗?
【发布时间】: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


【解决方案1】:

无论 .NET 进程使用什么位数,.NET Framework 都可以正常工作。 C# 编译器不关心位数。它所做的只是设置可以更改的 PE 标志。

显然,您要修改的第 3 方库可能取决于位数,方法是引用具有固定位数的库或仅包含 Debug.Assert(IntPtr.Size == 4);。就是这样。

我被警告过,通常使用 corflags 将 x86 程序集转换为 x64 程序集可能会导致问题。

是的。

System.Collections 程序集就是一个例子。

不确定这是从哪里来的......错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-17
    • 1970-01-01
    • 2016-10-30
    • 2019-10-19
    • 2010-09-09
    • 1970-01-01
    相关资源
    最近更新 更多