Process.Start()调用的MSBuild在VS2010和VS2013之间表现不同?

时间:2015-06-25 12:49:25

标签: c# visual-studio-2010 visual-studio-2012 visual-studio-2013 msbuild

我安装了VS2010和VS2013,并尝试通过调用MSBuild(C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319)来运行编译.net 4.0解决方案的程序。

对于记录,执行此操作的代码如下所示:

var processStartInfo = new ProcessStartInfo
            {
                FileName = pathToMSBuild,
                Arguments = "C:\path\to\mySolution.sln /nr:false",
                CreateNoWindow = true,
                UseShellExecute = false
            };
            var process = Process.Start(processStartInfo);
            process.WaitForExit();

我检查了.sln,其中包含.vcxproj和.csproj文件,这些文件只包含对ToolsVersion=4.0的引用。

当我在VS2010中执行程序(或打开cmd.exe并自己运行MSBuild命令)时,它可以正常工作并编译解决方案。但是,当我使用VS2013运行相同的程序时,我从MSBuild得到以下错误:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\CodeAnalysis\Micros
oft.CodeAnalysis.targets(214,5): error MSB4175: The task factory "CodeTaskFacto
ry" could not be loaded from the assembly "C:\WINDOWS\Microsoft.NET\Framework64
\v4.0.30319\Microsoft.Build.Tasks.v12.0.dll". Could not load file or assembly '
file:///C:\WINDOWS\Microsoft.NET\Framework64\v4.0.30319\Microsoft.Build.Tasks.v
12.0.dll' or one of its dependencies. The system cannot find the file specified
. [C:\...\solution\myProject.vcxproj]

我在msdn上发现了this answer实际为我解决了这个问题 - 在从这个文件中注释掉有问题的行后,我可以从VS2013成功调用MSBuild。但我不明白为什么这是相关的,因为我以为我正在运行一个v4.0 MSBuild来编译一个带有ToolsVersion=4.0的项目。

据推测,这是因为当我用VS2013运行/调试我的程序时,某些环境变量被设置了?我无法在互联网上找到任何细节。请有人解释一下这里发生了什么?

2 个答案:

答案 0 :(得分:1)

您可以尝试将/ v:diag开关添加到参数中。这将导致msbuild在输出详细程度设置为诊断的情况下运行。这将在每次调用开始时向您显示env vars和app域的状态,并可能帮助您识别差异。

注意 - 完成后请将其取出,因为这会显着降低构建过程的速度。

答案 1 :(得分:0)

问题

错误是无法加载文件或程序集系统找不到指定的文件.. .vcxproj

故障排除

打开ProcessMonitor并运行构建过程,直到它抛出错误。在失败时停止跟踪并调查ProcMon(Filemon)日志以查看MSBuild在哪里查找它找不到的.vcxproj或.xyz文件/程序集。解决!!

解决方案

将文件放在预期找到的位置。