想象一下,不使用COM组件或PInvoke的纯.NET应用程序。如果目标系统是32位或64位,那么这很重要吗?.NET在32位或64位系统上有什么区别?
回答
假设没有COM组件,P/Invoke等安全代码,应该没有语义差异,但性能可能会受到影响。考虑:64位内存更多,但引用更大。赢得一些,输掉一些。
无论如何,这里有一些有用的参考资料:
“[...]考虑一个.NET应用程序 是100%安全的代码在这种情况下 有可能采取您在 运行 .NET可执行文件。 32位机器并将其移动到 64位系统,并使其成功运行 为什么它可行? 由于程序集是100%类型安全的 我们知道在本机代码或COM对象上没有依赖项 并且 没有'不安全'的代码,这意味着 该应用程序在CLR的控制下完全运行 。在CLR 保证,而作为 刚刚在时间(JIT)编译的结果所产生的二进制代码 将32位和64位之间 不同, 执行该代码都将是 语义一样。 [...]”
理论上的应用将会运行相同,实际上在实现方面存在差异,32位和64位框架之间也存在不同的错误,这种情况并不常见,但确实发生了。在过去的2个月中,我遇到过至少3种情况,其中相同的MSIL在定位x86时的行为与在x64系统上定位AnyCPU时的行为不同。 – 2009-07-21 03:38:15
如果应用程序的目标是AnyCPU,则运行时行为将会有所不同,特别是内存使用情况和限制。
在64位上,不会有相同的32位内存限制(理论上2GB最大内存,实际上是1.2-1.6)。但是,所有的对象引用都是两倍,所以64位系统会使用更多的内存。
此外,64位系统通常有额外的寄存器等,所以有时性能可能会略有提高。不过,这是特定于平台的。
如果应用程序的目标是x86,它将在WoW64下运行,并且与它在32位系统中的行为方式几乎完全相同。
除了那些由Reed Copsey识别的方法之外,另一种方式可能是如果你的“纯粹”应用程序碰巧使用了System.IntPtr结构体,或者它使用了不安全的代码(这不是一回事作为P/Invoke)和指针算术。
另一个值得关注的重点是召唤几乎所有System.Runtime.InteropServices.Marshal类的东西。有各种各样的令人敬畏的方式在那里拍摄自己的脚(当然,当你需要它时非常有用)。
良好补充 – 2009-07-08 00:44:16
- 1. 64位文件系统与32位文件系统最大区别是什么
- 2. Windows 64位操作系统上的32位或64位Android SDK?
- 3. 什么告诉32位GCC在64位系统上,使64位二进制
- 4. 在32位操作系统和64位操作系统之间,类java.net.InetAddress有什么区别
- 5. 为什么32位和64位numpy/pandas之间有区别
- 6. 在64位Windows上安装32位或64位应用程序有什么区别?
- 7. JNA在64位操作系统上具有32位JVM
- 8. 64位操作系统上的32位或64位应用程序?
- 9. 32位/ 64位操作系统?
- 10. 什么数据类型是32位操作系统中的16位和64位操作系统中的32位?
- 11. 为什么setValue:forKey:在32位系统上失败,但不是在64位?
- 12. 无论系统是32位还是64位,int都是32位还是64位?
- 13. ODBC .NET 32位和64位
- 14. 无论系统是32位还是64位,uint均为32位?
- 15. 在32位或64位matlab上运行?
- 16. 32位和64位操作系统和处理器(Intel架构和Windows)之间有什么区别
- 17. 32位.NET应用程序和64位.NET应用程序有区别吗?
- 18. 64位.NET 4.5上的32位GetHashCode(CLR)
- 19. 在64位系统上注册32位DLL
- 20. 在32/64位系统上使用16位指针的C++
- 21. 安装在64位操作系统上的Windows 32位Eclipse?
- 22. 在64位系统上编译32位二进制
- 23. 如何在64位系统上以32位模式编译openSSL?
- 24. 在64位系统上检测32位程序的安装
- 25. 在64位系统上使用32位SQL服务器ODBC
- 26. 在64位操作系统上调试32位CASSINI(Oracle 9)
- 27. 在64位操作系统上启动32位进程
- 28. 在64位系统(Ubuntu)上编译32位程序集
- 29. 32位nasm程序集不在64位系统上启动
- 30. 在64位和32位系统上运行程序
重复:http://stackoverflow.com/questions/145026 – 2009-07-08 00:45:09