1

環境:

C# プロジェクト、Visual Studio 2008、C#、.Net 3.5、MSBuild

目的:

C# プロジェクト用に独自のカスタム ビルド タスクを実行し、プラットフォーム (Soln 構成プラットフォーム) に基づいて、ビルド前に Project オブジェクト自体にいくつかの操作を行います。BuildAction を EmbeddedResource に設定するなど。

それが終わったら、私は電話しますProject.Build()。とにかく Project オブジェクトを変更すると、ファイルがダーティ (および TFS からチェックアウト) とマークされるため、GlobalEngine で Project オブジェクトを使用したくありません。

問題:

エンジンとプロジェクトの独自のインスタンスを使用しているため、ビルド出力、エラーを VS に送信できません。からブール値を取得するだけですProject.Build()。アクセスなどを許可できるように接続できるイベントが見つかりませんBuildErrorEventArgsLog.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

1 に答える 1

4

私はそれを理解し、単にカスタムロガーを実装し、イベントハンドラーで 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);
于 2008-12-02T22:33:30.960 に答える