我正在尝试以编程方式将Visual Studio .csproj与MSBuild打包在一起(使用命名空间Microsoft.Build.Evaluation)。 我可以使用像
这样的命令正确打包这个项目 MSBuild "C:\Users\Documents\Visual Studio 2010\Projects\TestMvc\TestMvc\TestMvc.csproj" /T:Package
但是当我使用下面的代码时(我实现了自己的记录器,但这里没关系):
var project = new Microsoft.Build.Evaluation.Project(@"C:\Users\Documents\Visual Studio 2010\Projects\TestMvc\TestMvc\TestMvc.csproj");
var logger = new OutputLogger(_panel);
List<Microsoft.Build.Framework.ILogger> loggers = new List<Microsoft.Build.Framework.ILogger>();
loggers.Add(logger);
var targets = new string[]
{
"Package"
};
var result = project.Build(targets, loggers);
Microsoft.Build.Evaluation.ProjectCollection.GlobalProjectCollection.UnloadProject(project);
未构建解决方案。 Logger给我一个错误“输出文件”obj \ Debug \ TestMvc.dll“不存在。”
在Visual Studio中手动构建此项目(成功构建所有二进制文件后),此代码成功打包项目。所以已经有了所有必要的二进制文件。
问题是:为什么以编程方式启动的“Package”目标不等于命令行发出的“Package”,以及如何强制前者执行与命令行相同的操作?
UPD。的 为了看看发生了什么,我在两种情况下都启用了诊断输出。我得到了什么: Console命令生成以下日志:
Target "CoreCompile: (TargetId:37)" in file "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets" from project "D:\Users\Documents\Visual Studio 2010\Projects\MvcTest2\MvcTest3\MvcTest3.csproj" (target "Compile" depends on it):
Building target "CoreCompile" completely.
Output file "obj\Debug\MvcTest3.dll" does not exist.
Using "Csc" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "Csc" (TaskId:20)
C:\Windows\Microsoft.NET\Framework\v4.0.30319\Csc.exe .....
Microsoft (R) Visual C# 2010 Compiler version 4.0.30319.1 (TaskId:20)
Copyright (C) Microsoft Corporation. All rights reserved. (TaskId:20)
(TaskId:20)
Done executing task "Csc". (TaskId:20)
从API调用时,我得到以下日志:
Target "CoreCompile" in file "C:\Windows\Microsoft.NET\Framework\v4.0.30319\Microsoft.CSharp.targets":
Building target "CoreCompile" completely.
Output file "obj\Debug\MvcTest3.dll" does not exist.
Using "Csc" task from assembly "Microsoft.Build.Tasks.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a".
Task "Csc"
Done executing task "Csc".
因此,在两种情况下都会启动Csc任务,但是,当它由API启动时它不会产生任何输出文件(我甚至在文件监视器中检查过它,没有生成任何文件)。