何时在Visual Studio中定位x64

时间:2011-12-08 19:17:08

标签: .net visual-studio-2010 build 64-bit

我最近开始了一份新工作,我注意到每个人都在谈论的第一件事就是“更新”所有我们的.NET应用程序到x64。我最初认为这很奇怪,因为我们都知道.NET编译为平台无关的IL并且特定的CLR运行代码。

再往前看,我发现this helpful articlethis SO post有助于解释事情。

所以现在我明白IL没有改变,只有元数据基本上说是在WOW64上运行或者不是在x64系统上运行(简而言之)。

因此,如果我在x64系统上,我可以指定“任何CPU”本机运行,但不支持32位dll;我可以指定“x86”,它将支持32位dll(因为它们都将在WOW64下运行); 但我什么时候会指定“x64”?在x64系统上的“Any CPU”方案中似乎支持64位dll。这是因为我想阻止某人在32位系统上运行我的应用程序或者在尝试加载32位dll时确保失败吗?

在我看来,如果您的项目中有一些第三方dll,那么需要将其设置为“Any CPU”以外的其他内容。是否最好将其作为“任何CPU”留给其他不与其他dll打交道的项目?

如果我确实将我的目标设置为“x86”,因为我有一个32位的第三方dll,如果在WOW64下的64位系统上,我的应用程序是否真的被认为是64位运行?

2 个答案:

答案 0 :(得分:8)

是的,如果您正在调用本身为64位的DLL(因为它是本机的,或者是一个本身调用64位本机DLL的托管DLL等),您将指定项目应编译为x64

同样,如果您正在处理32位第三方DLL,则指定它应该是x86;如果在64位版本的Windows上运行,它将不被视为64位应用程序。

如果你只是处理纯托管代码,那么我会把事情留作“任何”。我通常也将DLL保留为“any”,即使可执行文件指定为x86或x64。

即使您正在处理本地dll,如果您使用PInvoke,您仍然可以将其保留为“any”;你可以有一个包含它的类的两个版本,一个用于x86,一个用于x64,并通过检查IntPtr.Size属性选择在运行时使用哪个版本。

当然,如果您的应用程序需要超过4 GB的RAM并且您希望强制它必须在64位操作系统上运行,那么您还需要定位x64。

答案 1 :(得分:2)

如果你通过COM或P / Invoke使用没有32位版本的本机代码,你可以指定x64。