何时在Visual Studio中针对x64进行目标设置

7
我最近开始了一份新工作,发现大家都在谈论将我们所有的.NET应用程序更新为x64。起初我觉得这很奇怪,因为我们都知道.NET编译成平台无关的IL代码,而特定的CLR运行代码。
进一步了解后,我找到了这篇有用的文章这个SO帖子,帮助我理解了事情的原委。
所以现在我明白了,IL代码没有改变,只是元数据基本上告诉它在WOW64上运行或不在x64系统上运行(简而言之)。
因此,如果我在x64系统上,可以指定“Any CPU”来本地运行,但不支持32位dll;我可以指定“x86”,它将支持32位dll(因为它们都将在WOW64下运行);但是,什么时候我才需要指定“x64”呢?似乎64位dll会在x64系统上的“Any CPU”场景中受支持。这是为了防止某人在32位系统上运行我的应用程序还是为了确保在尝试加载32位dll时失败?
对我来说,似乎只有在项目中涉及某些第三方dll时才需要将其设置为“Any CPU”以外的其他选项。对于没有涉及其他dll的每个其他项目,最好将其保留为“Any CPU”吗?
如果我确实将目标设置为“x86”,因为我有一个32位的第三方dll,那么如果在64位系统上仅在WOW64下运行,我的应用程序是否实际上被认为是在64位下运行?

1
在安装程序中,你不能忽略它。如果你有x64的要求,那么你必须将安装程序的TargetPlatform设置为x64。如果不这样做,它将无法正确安装。由于安装程序现在已经确保了64位操作系统可用,所以你选择EXE项目时选择什么已经不再重要。最好使用AnyCPU。 - Hans Passant
2个回答

8
是的,如果你调用的DLL本身是64位的(无论是因为它是本地的还是因为它是一个调用了64位本地DLL的托管DLL等),那么你需要指定项目编译为x64。
同样,如果你处理32位第三方DLL,则需要指定它应该是x86;如果在64位版本的Windows上运行,则不会被视为64位应用程序。
如果你只处理纯托管代码,那么我会将其保留为“任意”。即使可执行文件将被指定为x86或x64,我也通常将DLL保留为“任意”。
即使你正在处理本地dll,如果你使用PInvoke,你仍然可以将其保留为“任意”,并且可以有两个包装它的类的版本,一个用于x86,一个用于x64,并通过检查IntPtr.Size属性在运行时选择要使用哪个版本。
当然,如果你的应用程序需要超过4GB的RAM,并且你想强制它必须在64位操作系统上运行,那么你也需要目标为x64。

很多时候,您可以在32位和64位上使用相同的p/invokes。 - David Heffernan

2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接