6

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

有人请在这里帮助我,我觉得我错过了一些值得注意的东西。

更新

根据我在下面得到的信息,提供 x86 和 x64 版本是因为以下一个或多个原因:

  1. 开发人员希望避免 JIT,并使用 ngen.exe 之类的工具针对给定架构创建了他的代码的本机映像。

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

  3. 程序集可能包含使用 pinvoke 的 Win32 调用,它不会被 JIT 重新映射,因此构建应该以它绑定到的平台为目标。

4

3 回答 3

6

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

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

于 2009-01-17T23:38:30.167 回答
6

当你编译一个 .net 应用程序时,你必须在 Build Settings 中选择一个 Platform Target。选择是 AnyCPU、x86 和 x64。

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

因此,为了支持那些被其他依赖项强制直接为 x86 或 x64 构建的人,该程序集同时提供了这两者。

于 2009-01-18T02:40:50.940 回答
0

COM 处理跨 32/64 位边界的编组和解组。但是,它不支持将替代类型的二进制加载到错误的单元指针宽度中。

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

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

于 2013-09-03T02:27:28.750 回答