我需要为64位平台构建一个应用程序,以利用为64位计算机构建的DLL。我知道如何分别构建每个项目以针对64位平台。但是当您在一个Visual Studio解决方案中有许多项目时,某些DLL依赖于其他DLL。您如何确定要构建的项目为 x64 , x86 或任何CPU 。
提前致谢。
答案 0 :(得分:6)
当程序在“任何CPU”中编译时,意味着它是架构中立的 - 它可以在64位进程或32位进程中运行。平台确定程序正在执行。如果它是64位平台,则在任何CPU中构建的程序将作为64位进程加载。另一方面,如果它是32位平台,则在任何CPU中构建的程序将以32位进程加载。
但是,您无法将所有内容构建为“任何CPU”,因为您可能具有需要一个平台或另一个平台的依赖项
如果程序具有x64依赖项(依赖于x64中构建的其他库),则必须使用x64模式构建程序。这也要求程序在64位平台上执行
如果程序具有非托管的32位依赖项,或者如果它具有x86中的buit托管库,则必须使用x86模式构建程序。
程序程序既没有x64位依赖项,也没有非托管32位依赖项可以在“任何cpu”中构建。
但是,无论这些规则如何,如果您构建在任何CPU中,您应该在64位平台和32位平台上进行彻底测试。本文更详细地讨论了其他可能的问题。
答案 1 :(得分:3)
应用程序的位数由加载DLL的可执行文件确定。只要将启动过程配置为以x64为目标,只要将DLL配置为x64或任何CPU,就会将其加载为x64。因此,您不需要将所有DLL配置为x64,只需将启动应用程序配置为x64。其余的可以保留为任何CPU,除非它们具有特定的64位依赖性。
答案 2 :(得分:2)
对我来说,这真的归结为我依赖的东西。或者更准确地说,我的应用程序的DLL依赖项的传递闭包依赖于什么。如果它们中的任何一个具有特定的体系结构依赖性(x86或amd64),我将我的项目设置为具有相同的依赖性。这样我就可以帮助确保在错误的平台上加载任何问题都会尽早显示出来。
如果没有平台依赖,我的代码没有,我将它设置为AnyCPU,直到找到其他原因。
答案 3 :(得分:2)
添加其他优秀答案。我在MSDN
上找到了一些有用的信息在64位Windows操作系统上:
另请注意,64位进程无法加载x86 DLL。如果无法获得x64版本的DLL,则可选择在32位(WOW64)进程上运行x86 DLL,并使用64位进程执行进程间通信(IPC)。 More detail。
答案 4 :(得分:1)
去年有关.NET Rocks的讨论,here,这真的帮助我理解了所有的细微差别
答案 5 :(得分:0)
如果只有一个64位依赖项,则需要将每个组件构建为64位。