c# - 在自定义构建任务中运行 Project.Build() 时如何获取构建输出、错误列表?

标签 c# visual-studio msbuild msbuild-task

环境:

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/

相关文章:

Java加密C#解密不起作用

c# - 将 XElement 的子元素转换为字符串

c# - ASP .NET MVC 加载后如何将用户从 View 重定向到另一个页面?

visual-studio - 如何避免超过 Visual Studio 中的内部 ILK 大小限制?

c# - SGEN : An attempt was made to load an assembly with an incorrect format

c# - OLE DB 的 SAS 提供程序 (SAS.IOMProvider) 不适用于 ObjectPool

c# - 有什么方法可以将我的 C# 项目添加为 IronPython/IronRuby 中的引用吗?

c# - COM 互操作、隔离和排除重复引用

c# - 用于 msbuild 的自定义 IL 重写插件

MsBuild:将引用从ProjectReference更改为Reference