大约64位:.NET开发人员为什么要提供32位/ 64位版本的.NET程序集?

Why do .NET developers offer 32-bit/64-bit versions of .NET assemblies?

Evey时不时会看到.NET程序集的x86和x64版本。考虑以下用于SharePoint的Web部件。开发人员为什么不只提供一个版本,而让JIT编译器整理其余版本?当我看到这些产品时,是否仅仅是开发人员决定使用ngen之类的工具来创建本机映像以避免JIT?

有人请在这里帮助我,我觉得我缺少注意事项。

更新

从我下面得到的结果中,提供了x86和x64构建,因为以下一个或多个原因:

  • 开发人员希望避免JITing,而是使用ngen.exe之类的工具针对给定的体系结构创建其代码的本机映像。

  • 该程序集包含特定于平台的COM调用,因此将其构建为AnyCPU毫无意义。在这些情况下,针对不同平台的构建可能包含不同的代码。

  • 该程序集可能包含使用pinvoke的Win32调用,而JIT不会重新映射它们,因此该构建应针对与其绑定的平台。


  • 编译.net应用程序时,必须在"构建设置"中选择"平台目标"。选择是AnyCPU,x86和x64。

    一个常见的错误是在包含为x86编译的本机DLL的项目中指定AnyCPU。在64位计算机上运行时,这将导致错误,这是在64位计算机上进行测试的充分理由。

    因此,为了支持因其他依赖关系而被迫直接为x86或x64进行构建的人员,程序集同时提供了两者。


    如果他们使用特定的非.Net API,则可能有两个代码库,一个完美的例子是COM控件。

    正如您提到的,ngen也是另一个很好的理由。


    COM处理32/64位边界上的封送处理和取消封送处理。但是,它不提供任何支持将二进制的替代类型加载到错误的单元指针宽度中。

    许多程序集依赖于本机代码(例如,大多数SQL驱动程序是用C或C ++编写的)。对于使用p / invoke的任何事物,这都是非常明显的。因此,具有不同的指针宽度进行编译和分布意味着64位版本的程序包很可能包含64位本机DLL,而32位版本的程序包可能包含32位本机DLL。即使程序集的32位和64位版本是从相同的代码编译的,也是如此。

    如果您要求,csc将生成本机(预先Jitted)图像。