【发布时间】:2018-11-10 04:40:37
【问题描述】:
我总是绕开构建 64 位桌面应用程序的问题,因为我不知何故认为这不是一件小事,而且我想我并没有真正理解解决方案“配置” manager”对话框、平台和配置。
无论如何,我刚刚尝试通过简单地将所有解决方案项目的平台更改为 x64 来转换现有应用程序,并且成功了。我遇到的唯一问题是其中一个项目引用的 C++ DLL,它需要重建为 x64。
所以我的问题(最后)是:为什么我只有 C++ DLL 的问题,但我的解决方案中的项目引用的许多 .Net 程序集 DLL 都很好?
究竟是什么决定了我的应用程序是否构建为 64 位?我将解决方案的所有项目都更改为“x64”,但如果将它们保留为“任何 CPU”,并且我只将 WPF(启动)项目更改为“x64”,它仍然可以工作吗?
编辑
所以最后看来我只是能够将所有项目平台设置为“任何 CPU”而不是“x64”(TFS 服务器无法使用后者运行单元测试)。即使是引用非托管 64 位 DLL 的项目也对此感到满意(不知道为什么)。
诀窍是取消选中 WPF(启动)项目属性中的 Prefer 32-bit 选项。构建的应用程序现在作为 64 位应用程序运行,并且 TFS/单元测试运行良好。
【问题讨论】:
-
C# 编译器生成的 IL 代码并不关心甚至不知道(通常)它是以 32 位还是 64 位运行。 JIT 编译器会处理这个问题。因此托管代码可以轻松地在任一平台上运行。
-
您可以将所有不调用非托管代码(并且不包含对体系结构特定库的引用)的类库项目配置为“任何 CPU”。
-
嗯,您在 C++ 项目中所要做的就是更改平台。而您在 C# 项目中所要做的就是更改平台。但它是不同的设置,不是由解决方案平台选择的。右键单击您的 EXE 项目 > 属性 > 构建选项卡。请务必为 Debug 和 Release 版本更改它。
-
@C.Evenhuis 我建议删除“首选 32 位”选项,否则程序将在 intel/amd 处理器上以 32 位运行(但在不支持 32 位的平台上运行 64 位)(技术上更复杂。如果支持 32 位,它将运行在 32 位,否则将运行在 64 位。在接下来的几年中,一些操作系统将放弃对 32 位的支持)
-
编译器不会针对非托管 dll 的目标架构验证这一点,正如 MatthewWatson 所提到的,无论如何,结果 IL 都是相同的。您必须手动指定目标平台,以通知您的库的用户它(部分)仅在该平台中(正确)运行。
标签: c# .net 32bit-64bit