使用MSBuild构建x64 C#项目会导致生成32位目标。

7
我正在使用Visual Studio 2010构建一个包含x86和x64目标的c#项目。当我使用IDE构建时,我可以得到正确的x64和x86目标结果。
但是,当我在命令行上使用msbuild构建时,尽管我在命令行上指定了x64,但所有内容都被构建为x86。
在我升级到.Net 4.5之前,我没有遇到这个问题。在.Net 4.0中,即使我在命令行上指定了x86,也能够获得我的x64目标。
我在.Net 4.0环境下进行了一次构建,然后在.Net 4.5环境下进行了另一次构建,并将输出导入日志文件中。我注意到日志文件中有一些差异,但我认为这就是导致我的问题的原因:
在.Net 4.0的日志文件中,我看到了这一行:
/reference:C:\Windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.CSharp\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.CSharp.dll
在.Net 4.5的日志文件中,我看到了这一行: /r:"C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework.NETFramework\v4.0\Microsoft.CSharp.dll"
你有什么想法吗?看起来,.Net 4.5正在使用一个x86特定的路径。

1
你使用什么命令行来运行msbuild?你是构建sln文件还是csproj文件?你如何传递特定的配置? - Lanorkin
msbuild project.sln /p:Platform="x64" /t:Clean;Rebuild /p:Configuration=Debug - Tony
在日志的开头,Building solution configuration "Debug|x64" 这一行的配置是否正确?你如何理解结果不正确?哪些输出目录被创建 - bin\x86\Debug 还是 bin\x64\Debug - Lanorkin
是的,正在构建解决方案配置“Debug|x64”。所有东西都放在bin\Debug中。当我运行应用程序时,我查看任务管理器并发现它是一个x86进程。如果我在具有.NET 4.0的服务器上构建它或使用IDE构建它,则不会看到这一点。 - Tony
1个回答

5
如果您的解决方案的x64配置被配置为将项目构建为AnyCPU,则可能会发生这种情况。在.NET 4.5中有一个新的配置选项Prefer 32 bit,使带有Prefer32bit标志的可执行文件在64位机器上启动为32位进程。由于Prefer32bit标志是MSBuild目标中的默认设置,因此您将看到您所描述的行为,即从.NET 4.0升级到.NET 4.5将导致您的AnyCPU项目从64位切换到32位。
要使项目(而不是解决方案)构建为x64,请在命令行上指定它。
msbuild project.csproj /p:Platform=x64

注意,命令行是针对 .csproj 文件,而非 .sln 文件。

或者,在“配置管理器”中验证你的解决方案配置,并确保它被构建为 x64。


1
谢谢!我能够在我的msbuild命令行中添加/property:Prefer32bit=false,并且看起来这解决了问题。 - Tony
1
使用哪个开关来使用msbuild构建64位解决方案? - Shameel Mohamed

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