环境:
C# 项目、Visual Studio 2008、C#、.Net 3.5、MSBuild
目标:
为我的 C# 项目运行我自己的自定义构建任务,并基于平台(Soln 配置平台),在构建之前对项目对象本身进行一些操作。比如将 BuildAction 设置为 EmbeddedResource 等
完成后,我调用 Project.Build()
。我不想在 GlobalEngine 上使用 Project 对象,因为一旦您以任何方式修改 Project 对象,它就会将文件标记为脏文件(并从 TFS checkout )。
问题:
因为我使用的是我自己的引擎实例和项目,所以我无法将构建输出和错误定向到 VS。我只从 Project.Build()
中得到一个 bool 值。
我没有找到任何我可以连接的事件,这些事件可以允许访问 BuildErrorEventArgs
和类似的东西。我知道我可以使用 Log.LogErrorEvent()
将消息记录到 VS 错误列表。但我需要先获取构建输出本身才能做到这一点。
代码:
// Execute method in my custom build task class, derives from a BaseTask class
public override bool Execute()
{
Engine engine = new Engine();
Project project = new Project(engine);
project.Load(ProjectName);
Log.LogMessage(Microsoft.Build.Framework.MessageImportance.High, "Got the Project");
// Set the project's DefaultTargets to "Build" to be able to build with CSharp targets
project.DefaultTargets = "Build";
IsBuilt = project.Build(); // Isbuilt bool is a property in my BaseTask class
// Here's where I want to get Build output and direct it to VS output window and errorlist window
engine.Shutdown();
return base.Execute();
}
最佳答案
我明白了,只需实现一个自定义记录器并在事件处理程序中使用 Log.LogMessage 或 LogError
public class MyCustomBuildLogger : ILogger
{
private IEventSource source;
public void Initialize(IEventSource eventSource)
{
this.source = eventSource;
//Events.ProjectStarted += new ProjectStartedEventHandler(Events_ProjectStarted);
//Events.ProjectFinished += new ProjectFinishedEventHandler(Events_ProjectFinished);
Events.WarningRaised += new BuildWarningEventHandler(Events_WarningRaised);
Events.ErrorRaised += new BuildErrorEventHandler(Events_ErrorRaised);
Events.BuildFinished += new BuildFinishedEventHandler(Events_BuildFinished);
//Events.BuildStarted += new BuildStartedEventHandler(Events_BuildStarted);
Events.MessageRaised += new BuildMessageEventHandler(Events_MessageRaised);
//Events.CustomEventRaised += new CustomBuildEventHandler(Events_CustomEventRaised);
Events.MessageRaised += new BuildMessageEventHandler(Events_MessageRaised);
}
void Events_ErrorRaised(object sender, BuildErrorEventArgs e)
{
// This logs the error to VS Error List tool window
Log.LogError(String.Empty,
String.Empty,
String.Empty,
e.File,
e.LineNumber,
e.ColumnNumber,
e.LineNumber,
e.ColumnNumber,
e.Message);
}
}
在 MyCustomBuildTask 类中,您可以在其中设置和加载引擎和项目,
_logger = new MyCustomBuildLogger();
_logger.Log = Log;
_engine.RegisterLogger(_logger);
关于c# - 在自定义构建任务中运行 Project.Build() 时如何获取构建输出、错误列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/296695/