我安装了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运行/调试我的程序时,某些环境变量被设置了?我无法在互联网上找到任何细节。请有人解释一下这里发生了什么?
答案 0 :(得分:1)
您可以尝试将/ v:diag开关添加到参数中。这将导致msbuild在输出详细程度设置为诊断的情况下运行。这将在每次调用开始时向您显示env vars和app域的状态,并可能帮助您识别差异。
注意 - 完成后请将其取出,因为这会显着降低构建过程的速度。
答案 1 :(得分:0)
错误是无法加载文件或程序集和系统找不到指定的文件.. .vcxproj :
打开ProcessMonitor并运行构建过程,直到它抛出错误。在失败时停止跟踪并调查ProcMon(Filemon)日志以查看MSBuild在哪里查找它找不到的.vcxproj或.xyz文件/程序集。解决!!
将文件放在预期找到的位置。