32 位或 64 位系统中的 .NET 有什么区别?

发布于 2024-07-26 13:03:13 字数 71 浏览 6 评论 0原文

想象一个不使用 COM 组件也不使用 PInvoke 的纯 .NET 应用程序。 目标系统是 32 位还是 64 位有关系吗?

Imagine a pure .NET application which do not uses COM components nor PInvoke. Does it matters if the target system is 32 or 64 bits?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

濫情▎り 2024-08-02 13:03:13

如果应用程序面向 AnyCPU,则运行时行为将会有所不同,特别是内存使用和限制。

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

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

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

If the application is targetting AnyCPU, the runtime behavior will be different, in particular, the memory usage and limitations.

On 64bit, there will not be the same 32bit memory limitations (2GB max memory theoretical, but 1.2-1.6 in practice). However, all object references are twice as large, so 64bit systems will use more memory.

Also, 64bit systems often have extra registers, etc, so sometimes performance can improve slightly. This is platform specific, though.

If the application is targetting x86, it will run under WoW64 and act nearly identically to how it will act in 32bit systems.

沉默的熊 2024-08-02 13:03:13

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

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

“[...]考虑一个.NET应用程序
这是 100% 类型安全的代码。 在这个
场景可以采取你的
您在您的计算机上运行的 .NET 可执行文件
32位机器并将其移动到
64位系统并运行
成功地。 为什么这有效?
由于该程序集是 100% 类型安全的
我们知道没有依赖关系
在本机代码或 COM 对象上
没有“不安全”代码,这意味着
应用程序完全运行
在 CLR 的控制下。 公共语言运行库
保证虽然二进制代码
其结果是
即时(JIT)编译将是
32位和64位之间的区别,
执行的代码都是
语义上相同。 [...]”

Assuming safe code with no COM components, P/Invoke, etc. there should be no semantic difference, but performance may be impacted. Consider: More memory under 64-bit, but references are bigger. Win some, lose some.

Anyway, here are a few useful references:

"[...] Consider a .NET application
that is 100% type safe code. In this
scenario it is possible to take your
.NET executable that you run on your
32-bit machine and move it to the
64-bit system and have it run
successfully. Why does this work?
Since the assembly is 100% type safe
we know that there are no dependencies
on native code or COM objects and that
there is no 'unsafe' code which means
that the application runs entirely
under the control of the CLR. The CLR
guarantees that while the binary code
that is generated as the result of
Just-in-time (JIT) compilation will be
different between 32-bit and 64-bit,
the code that executes will both be
semantically the same. [...]"

ぃ弥猫深巷。 2024-08-02 13:03:13

除了 Reed Copsey 指出的那些之外,另一种可能很重要的方式是,您的“纯”应用程序是否碰巧使用 System.IntPtr 结构进行某些操作,或者它是否使用不安全的代码(这与 P/Invoke 不同) ) 和指针算术。

另一个需要注意的大问题是对 System.Runtime.InteropServices.Marshal 类。 那里有各种很棒的方法可以搬起石头砸自己的脚(当然,当你需要时非常有用)。

Another way it can matter, apart from those identified by Reed Copsey, is if your "pure" application happens to use the System.IntPtr struct for something, or if it uses unsafe code (which isn't the same thing as P/Invoke) and pointer arithmetic.

Another big one to look out for would be calls to pretty much anything in the System.Runtime.InteropServices.Marshal class. There are all kinds of awesome ways to shoot yourself in the foot in there (extremely useful when you need it, of course).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文