3

快速背景:我在 Vista-x64 机器上的 .net 3.5 下的 VS2008 中开发 C#

我最近切换到Vista-x64,经过一番搜索,我仍然觉得我不完全了解OS和.net框架之间的相互作用。我想对此进行一些更正/澄清。

以下是我对开发过程的理解(如有错误请指正):

当我设置我的项目时,我可以设置平台目标:x64、x86、AnyCpu。据我了解,AnyCpu 将针对当前平台(在我的情况下为 x64)。我也可以针对 x86 并仍然执行它(由于 WoW64)。

我假设当我以 x64 为目标时,该程序将使用 64 位 .net 框架 3.5,以及类似的用于 x86 的 32 位框架。它是否正确?

让我感到困惑的是,当我以 x64 为目标并打印出平台信息时,它会打印“ WIN32NT ”。这让我相信“ WIN32NT ”不是我想的那样,但我还没有找到很多关于这个的信息。这是什么?

ComputerInfo computerInfo = new ComputerInfo();
Console.WriteLine("{0,-30}:\t{1}", "Platform", computerInfo.OSPlatform);

谢谢。

4

4 回答 4

5

它并没有真正帮助,但所有环境都返回 win32nt ......如果他们返回 win64nt 会有所帮助,不是吗?

您是否发现任何其他问题?还是只是在这里求知?

尝试检查您的 IntPtr 大小。它会让您知道您的应用程序是否在 64 位模式下运行(我认为)

http://msdn.microsoft.com/en-us/library/system.intptr.size.aspx

http://blogs.msdn.com/kstanton/archive/2004/04/20/116923.aspx

于 2009-10-16T21:28:36.897 回答
4

通常,您会希望以 AnyCPU 为目标 - AnyCPU 在目标系统的“本机”模式下运行。如果您在 32 位计算机上启动应用程序,它将以 32 位运行,如果您在 64 位系统上启动,它将以 64 位运行。

使用其他设置之一的唯一原因是特定需要以 32 位或 64 位运行。如果您使用具有特定要求的库,则会发生这种情况。例如,这个SQLITE库包含非托管代码。当我在编译到 AnyCPU 的应用程序中使用它时,该应用程序在 32 位系统上运行良好,但无法在 64 位系统上加载库。原因是 Sqlite 库中的非托管代码被编译为 32 位。即使在 .net 中,您也不能混合使用 32 位和 64 位程序集。

在这种情况下,正确的解决方案是显式编译为 x86(这是一个小工具,无法从 64 位运行中获益)。因此,即使在 64 位 Windows 上,我的应用程序也可以作为 32 位应用程序运行。

另一种可能性是将应用程序编译为 AnyCPU,但显式处理不同的平台,例如通过延迟加载正确的非托管程序集。

除了非托管代码的这种影响之外,我相信它在很大程度上与应用程序编译的框架无关。只会想到极端的反例,也许您可​​能想要将应用程序编译为需要大量 RAM 的 x64。但是典型的普通 .net 应用程序不会关心它在什么处理器和什么模式下运行。但是,如果您想知道,您可以随时按照其他答案中的建议检查 IntPtr 的大小。

于 2009-10-16T21:49:14.460 回答
3

AnyCpu 不针对当前的开发者平台。正如它所说,它针对任何cpu。运行在目标机器上的JIT编译器会根据目标机器操作系统将IL编译成32位或64位指令集。这意味着编译为 AnyCpu 的 .Net 程序集将在 32 位和 64 位平台上运行。

于 2009-10-16T21:40:38.430 回答
3

IIRC,Win32 被视为 Windows API 的名称,而 Win32NT 是源自 Windows NT 的所有 Windows 版本的 API/平台的名称。而且 Windows 95 不是 Win32NT,因为 NT 和 9x API 密切相关并且大部分兼容,但并不相同。此外,Win32NT API 在 x86 和 x64(以及 Itanium,它与 x64 完全不同)上是相同的。

自从引入 64 位 Windows 以来,32 不再是对处理器架构或指针大小的引用。(事实上​​,Win32 早期也在 Alpha 机器上工作过,所以 Win32 绝对不是 x84 的 Windows。)

如果您想知道您是使用 32 位还是 64 位,您可以询问 IntPtr 的大小

IntPtr.Size // 4 when running as x84, 8 when running on x64 or Itanium

虽然严格来说,这并不是你所要求的。

于 2009-10-16T21:41:20.833 回答