【问题标题】:How to get Build output, error list, when running Project.Build() in a custom build task?在自定义构建任务中运行 Project.Build() 时如何获取构建输出、错误列表?
【发布时间】:2008-11-17 19:59:42
【问题描述】:

环境:

C# 项目、Visual Studio 2008、C#、.Net 3.5、MSBuild

目标:

为我的 C# 项目运行我自己的自定义构建任务,并且基于平台(Soln 配置平台),我在构建之前对 Project 对象本身进行了一些操作。比如将 BuildAction 设置为 EmbeddedResource 等。

完成后,我会致电Project.Build()。我不想在 GlobalEngine 上使用 Project 对象,因为无论如何修改 Project 对象后,它都会将文件标记为脏(并从 TFS 签出)。

问题:

因为我使用的是我自己的引擎实例和项目,所以我无法将构建输出、错误定向到 VS。我只从Project.Build() 中得到一个布尔值。 我找不到任何我可以连接的事件可以允许访问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();
}

【问题讨论】:

    标签: c# visual-studio msbuild msbuild-task


    【解决方案1】:

    我想通了,只需实现一个自定义记录器并在事件处理程序中使用 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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-27
      • 2012-08-07
      • 2015-12-28
      • 2019-01-10
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 2018-12-15
      相关资源
      最近更新 更多