困惑于选择32位还是64位构建

11
我有一个包含几个项目(包括C# WPF应用程序和类库)的VS2013解决方案。每个项目的“平台目标”都设置为“任何 CPU”。我以为生成的 EXE 在64位PC上会作为64位应用程序运行,在32位PC上作为32位应用程序运行。这是正确的吗?我的开发PC是64位的,但当我运行应用程序(独立运行或通过VS调试)时,在任务管理器中显示为 “foo.exe *32”。这是怎么回事?
我们有一位使用32位机器的初级开发人员。他是否仍能打开解决方案并在VS中运行它?
另外,一些项目引用第三方DLL。供应商提供了32位和64位版本-项目应引用哪个版本的DLL?如果引用32位DLL,是否会防止应用程序作为64位应用程序运行?如果引用64位版本,会对32位开发人员造成问题吗?至于最终用户-我的安装程序是否需要检查操作系统版本并复制适当的DLL?
最后,那么NuGet 引用的 DLL 呢?NuGet 是否安装32位或64位版本的DLL?如何处理32位或64位的最终用户安装?

可能是 Visual Studio“Any CPU”目标的含义是什么? 的重复问题。 - d3dave
2个回答

9
我将尝试回答你的一些问题,因为你把它们都放在了一个问题里。
我们有一位32位机器的初级开发人员。他是否仍能在VS中打开解决方案并运行它?
是的,只要所有项目都设置为构建为“Any CPU”,并且没有对64位程序集或本地DLL的外部依赖项。
如果我引用32位DLL,这会阻止应用程序作为64位应用程序运行吗?
是的,如果任何程序集或链接的COM组件是针对32位CLR专门构建的,则需要整个项目作为32位进程运行。您始终要小心您的项目可能依赖的本机代码。
如果我引用64位版本,这会给32位开发人员带来问题吗?
是的,如果有任何64位程序集,则32位开发人员将无法在其计算机上运行该项目。
最后我想说的是,最终可执行项目是构建为“Any CPU”还是针对特定的32位或64位目标平台非常重要。
通常我发现,除非所有链接的程序集也针对“Any CPU”和没有外部的本地依赖项,否则将最终可执行文件构建为“Any CPU”可能会在运行时(Bad Image运行时异常)引起各种问题。后者是最难确保的。
另一方面,为明确指定的32位或64位平台构建的最终可执行文件可以愉快地包含为“Any CPU”构建的其他程序集。

实际上,我相信如果您引用了一个32位的DLL并且应用程序是Any CPU,那么在64位机器上运行时会出现运行时异常。这可能已经随着最新的.NET而改变,但以前是这样工作的。 - Tim B
谢谢您的回复。现在开始,我感觉选择“任何CPU”可能有些困难,因为我发现很难确定哪些引用是32位的,哪些是64位的(尤其是通过NuGet获取的)。我还注意到项目正在引用路径'C:\ Program files(x86)\Reference Assemblies \ ...'上的所有.Net框架程序集。只是好奇为什么VS会在这里查找,而不是(比如)C:\ Windows \ Microsoft.Net \ Framework \或\Framework64? - Andrew Stephens
@TimB 你说得对。当一个可执行文件被构建为 Any CPU 时,它将在运行时作为 64 位进程加载,如果任何引用的托管或非托管代码是以 32 位代码构建的,则会导致 Bad Image 运行时异常。我想说的是,它将需要最终程序集以 32 位进程运行。 - Mike Dinescu

1

我们有一位使用32位机器的初级开发人员。他是否仍然能够在VS中打开解决方案并运行它?

是的,他可以运行。

如果我引用32位DLL / 64位,这是否会阻止应用程序作为64位/ 32位应用程序运行?

需要手动编辑.csproj文件。您还需要为不同的二进制文件创建单独的目录,最好是彼此的同级目录,并具有与您正在针对的平台相同的名称。

参考 在Visual Studio中构建时有条件地使用32/64位引用

那么对于最终用户-我的安装程序是否需要检查操作系统版本并复制适当的DLL?

是的,您需要管理构建过程脚本以为不同的架构创建特定版本。

参考:
Visual Studio的“任意CPU”目标是什么意思?


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