【发布时间】:2009-07-30 03:51:25
【问题描述】:
我需要为 64 位平台构建一个应用程序,以利用为 64 位机器构建的一些 DLL。我知道如何分别构建每个项目以针对 64 位平台。但是,当您在一个 Visual Studio 解决方案中有多个项目时,一些 DLL 依赖于其他 DLL。您如何决定将哪些项目构建为 x64、x86 或 Any CPU。
提前致谢。
【问题讨论】:
标签: .net visual-studio 64-bit
我需要为 64 位平台构建一个应用程序,以利用为 64 位机器构建的一些 DLL。我知道如何分别构建每个项目以针对 64 位平台。但是,当您在一个 Visual Studio 解决方案中有多个项目时,一些 DLL 依赖于其他 DLL。您如何决定将哪些项目构建为 x64、x86 或 Any CPU。
提前致谢。
【问题讨论】:
标签: .net visual-studio 64-bit
当程序在“ANY CPU”中编译时,这意味着它是体系结构中立的——它可以在 64 位进程或 32 位进程中运行。它由正在执行程序的平台决定。如果是 64 位平台,任何 CPU 内置的程序都将作为 64 位进程加载。另一方面,如果它是 32 位平台,任何 CPU 中内置的程序都将加载到 32 位进程中。
但是,您不能将所有内容都构建为“任何 CPU”,因为您可能具有需要一个平台或另一个平台的依赖项
如果程序具有 x64 依赖项(依赖于其他以 x64 构建的库),则必须使用 x64 模式构建程序。这也需要程序在64位平台上执行
如果程序具有非托管的 32 位依赖项或者如果它具有在 x86 中构建的托管库,则必须使用 x86 模式构建程序。
程序程序既没有 x64 位依赖,也没有非托管 32 位依赖,可以在“任何 cpu”中构建。
但是,不管这些规则如何,如果您在任何 CPU 中构建,您都应该在 64 位平台和 32 位平台上进行全面测试。这篇文章更详细地讨论了其他可能的问题。
【讨论】:
应用程序的位数由加载 DLL 的可执行文件决定。只要将启动进程配置为以 x64 为目标,那么只要将 DLL 配置为 x64 或任何 CPU,它们就会被加载为 x64。因此,您不需要将所有 DLL 配置为 x64,只需启动应用程序即可。其余的可以保留为 Any CPU,除非它们具有特定的 64 位依赖项。
【讨论】:
对我来说,这真的归结为我所依赖的。或者更准确地说,我的应用程序的 DLL 依赖项的传递闭包依赖于什么。如果其中任何一个具有特定的架构依赖项(x86 或 amd64),我将我的项目设置为具有相同的依赖项。通过这种方式,我可以帮助确保在错误平台中加载的任何问题都会尽早出现。
如果没有平台依赖性并且我的代码没有,我将其设置为 AnyCPU,直到找到其他原因。
【讨论】:
在其他很棒的答案之上添加。我在MSDN上找到了一些有用的信息
在 64 位 Windows 操作系统上:
另请注意,x86 DLL 不能在 64 位进程上加载。如果无法获得 x64 版本的 DLL,另一种方法是在 32 位 (WOW64) 进程上运行 x86 DLL,并与 64 位进程进行进程间通信 (IPC)。 More detail。
【讨论】:
去年在 .NET Rocks 上对此进行了很好的讨论,here,它确实帮助我理解了所有细微差别
【讨论】:
如果只有一个 64 位依赖项,那么您需要将每个组件构建为 64 位。
【讨论】: