5

想象一个不使用 COM 组件或 PInvoke 的纯 .NET 应用程序。目标系统是 32 位还是 64 位是否重要?

4

3 回答 3

7

如果应用程序以 AnyCPU 为目标,则运行时行为会有所不同,尤其是内存使用情况和限制。

在 64 位上,不会有相同的 32 位内存限制(理论上最大内存为 2GB,但实际上为 1.2-1.6)。但是,所有对象引用都是两倍大,因此 64 位系统将使用更多内存。

此外,64 位系统通常有额外的寄存器等,因此有时性能会略有提高。不过,这是特定于平台的。

如果应用程序以 x86 为目标,它将在 WoW64 下运行,其行为几乎与在 32 位系统中的行为相同。

于 2009-07-08T00:12:36.533 回答
5

假设没有 COM 组件、P/Invoke 等的安全代码应该没有语义差异,但性能可能会受到影响。考虑:64 位下的内存更多,但引用更大。赢一些,输一些。

无论如何,这里有一些有用的参考资料:

“[...] 考虑一个 100% 类型安全代码的 .NET 应用程序。在这种情况下,可以将您在 32 位计算机上运行的 .NET 可执行文件移动到 64 位系统,然后它是否成功运行。为什么会这样?由于程序集是 100% 类型安全的,我们知道对本机代码或 COM 对象没有依赖关系,并且没有“不安全”代码,这意味着应用程序完全在控制下运行CLR 保证,虽然作为即时 (JIT) 编译结果生成的二进制代码在 32 位和 64 位之间会有所不同,但执行的代码在语义上是相同的. [...]”

于 2009-07-08T00:37:55.727 回答
4

除了 Reed Copsey 确定的那些之外,另一种重要的方式是,如果你的“纯”应用程序碰巧使用 System.IntPtr 结构来做某事,或者它使用不安全的代码(这与 P/Invoke 不同) ) 和指针算术。

另一个需要注意的是调用System.Runtime.InteropServices.Marshal类中的几乎所有内容。有各种很棒的方法可以让你在脚下开枪(当然,在你需要的时候非常有用)。

于 2009-07-08T00:36:18.613 回答