2008-11-17 70 views
1

环境:如何在自定义生成任务中运行Project.Build()时获取生成输出,错误列表?

C#项目,Visual Studio 2008中,C#,.net 3.5的MSBuild

目的:为我的C#项目

跑我自己的自定义生成任务,并根据该平台(Soln配置平台),我在构建之前对Project对象进行一些操作。就像将BuildAction设置为EmbeddedResource等。

一旦完成,我打电话给Project.Build()。我不想在GlobalEngine上使用Project对象,因为它会将文件标记为脏(并从TFS签出),一旦您修改了Project对象。

问题:

因为我用我自己的发动机的情况下,和项目,我不能够直接生成输出,错误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(); 
} 

回答

4

我想通了,只是实现自定义记录器,并在事件处理程序

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类,其中使用Log.LogMessage或LOGERROR您设置并加载引擎和项目,

_logger = new MyCustomBuildLogger(); 
_logger.Log = Log; 
_engine.RegisterLogger(_logger); 
相关问题