对构建 32 位或 64 位感到困惑

Posted

技术标签:

【中文标题】对构建 32 位或 64 位感到困惑【英文标题】:Confused about building for 32- or 64-bit 【发布时间】:2014-06-25 20:57:42 【问题描述】:

我有一个包含多个项目的 VS2013 解决方案(一个 C# WPF 应用程序和类库)。每个项目的“平台目标”设置为“任何 CPU”。我的印象是,生成的 EXE 将作为 64 位应用程序在 64 位 PC 上运行,而在 32 位 PC 上作为 32 位应用程序运行。它是否正确?我的开发 PC 是 64 位的,但是当我运行应用程序(独立或通过 VS 调试)时,它在任务管理器中显示为“foo.exe *32”。这是怎么回事?

我们有一个 32 位机器的初级开发人员。他还能打开解决方案并在 VS 中运行吗?

此外,一些项目引用了第 3 方 DLL。供应商提供 32 位和 64 位版本 - 项目应该引用哪一个?如果我引用 32 位 DLL,这会阻止应用程序作为 64 位应用程序运行吗?如果我引用 64 位版本,这会给 32 位开发者带来问题吗?那么最终用户呢?我的安装程序是否需要检查操作系统版本并跨适当的 DLL 进行复制?

最后,通过 NuGet 引用的 DLL 呢? NuGet 是否安装 32 位或 64 位版本的 DLL?如何处理 32 位或 64 位最终用户安装?

【问题讨论】:

What does the Visual Studio "Any CPU" target mean?的可能重复 【参考方案1】:

我将尝试回答你的一些问题,因为你已经将这么多的问题捆绑到一个单一的..

We have a junior developer with a 32-bit machine. Will he still be able to open the solution and run it in VS?

可以,只要所有项目都设置为为 Any CPU 构建,并且对 64 位程序集或本机 DLL 没有外部依赖项。

If I reference the 32-bit DLL will this prevent the application from running as a 64-bit application?

是的,如果任何程序集或链接的 COM 组件是专门针对 32 位 CLR 构建的,那么它将要求整个项目作为 32 位进程运行。您必须始终小心您的项目可能依赖的本机代码。

And if I reference the 64-bit version, will this cause problems for the 32-bit developer?

是的,如果有任何 64 位程序集,32 位开发人员将无法在他的机器上运行该项目。


作为最后的想法,我想补充一点,最终的可执行项目是构建为Any CPU,还是构建为特定的 32 位或 64 位目标平台非常重要。

通常我发现将最终的可执行文件构建为 Any CPU 会在运行时导致各种问题(坏图像运行时异常种类),除非所有链接的程序集也针对 Any CPU 并且没有外部,本机,依赖项。后一个要求是最难保证的。

另一方面,为明确指定的 32 位或 64 位平台构建的最终可执行文件可以愉快地合并为 Any CPU 构建的其他程序集

【讨论】:

其实,我相信如果你引用一个 32 位的 DLL 并且应用程序是 Any CPU,你在 64 位机器上运行时会出现运行时异常。这可能在最新的 .NET 中有所改变,但它曾经是这样工作的。 感谢您的回复。开始感觉“任何 CPU”路线有点令人担忧,因为我发现很难发现哪些引用是 32 哪些是 64(尤其是那些通过 NuGet 的)。我还注意到这些项目正在引用路径 `C:\Program files (x86)\Reference Assemblies\... 上的所有 .Net 框架程序集...只是好奇为什么 VS 在这里而不是(比如说)C:\ Windows\Microsoft.Net\Framework\ 或 \Framework64? @TimB 你是对的。当可执行文件构建为 Any CPU 时,它将在运行时作为 64 位进程加载,如果任何引用的托管或非托管代码构建为 32 位代码,将导致错误映像运行时异常。我的意思是它需要最终程序集作为 32 位进程运行。【参考方案2】:

我们有一个 32 位机器的初级开发人员。他还能打开解决方案并在 VS 中运行吗?

是的,他会跑。

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

.csproj 文件的手动版本。您还需要为不同的二进制文件提供单独的目录,最好是彼此的兄弟,并且与您的目标平台具有相同的名称。

参考Conditionally use 32/64 bit reference when building in Visual Studio

最终用户怎么办 - 我的安装程序是否需要检查操作系统版本并跨适当的 DLL 进行复制?

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

参考:What does the Visual Studio "Any CPU" target mean?

【讨论】:

以上是关于对构建 32 位或 64 位感到困惑的主要内容,如果未能解决你的问题,请参考以下文章

对leal感到困惑。它是不是也访问内存地址的内容?

对QSPI FLASH的XIP(eXecute In Place)功能感到困惑

Google Protocol Buffers - 对编码解码 base64 char * c 字符串协议缓冲区数据感到困惑

无法使用 catkin_make 构建 ROS 包。对包树感到困惑

Visual Studio - C++ - 作为 32 位或 64 位构建和运行应用程序 - 从适当的 ProgramFiles 目录加载 DLL

对 Tensorflow 中的多层双向 RNN 感到困惑