2010-03-14 37 views
1

我想写接收关于任务和它的参数TaskStarted事件时记录信息的MSBuild记录器模块。阅读通过事件的MSBuild的自定义任务属性在Logger

构建运行与命令:

MSBuild.exe /logger:MyLogger.dll build.xml 

内Build.xml是任务,其中大部分已被定制编写的编译(C++或C#)溶液的序列,和被访问用下面的自定义任务:

<DoCompile Desc="Building MyProject 1" Param1="$(Param1Value)" /> 
<DoCompile Desc="Building MyProject 2" Param1="$(Param1Value)" /> <!-- etc --> 

自定义构建任务DoCompile被定义为:

public class DoCompile : Microsoft.Build.Utilities.Task 
{ 
    [Required] 
    public string Description { set { _description = value; } } 

    // ... more code here ... 
} 

虽然构建运行时,每个任务开始时,记录模块接收IEventSource.TaskStarted事件,订阅如下:

public class MyLogger : Microsoft.Build.Utilities.Logger 
{ 
    public override void Initialize(Microsoft.Build.Framework.IEventSource eventSource) 
    { 
     eventSource.TaskStarted += taskStarted; 
    } 

    private void taskStarted(object sender, Microsoft.Build.Framework.TaskStartedEventArgs e) 
    { 
     // write e.TaskName, attributes and e.Timestamp to log file 
    } 
} 

我的问题是,在上述taskStarted()方法,我希望能够到访问事件被触发的任务的属性。 我只能访问记录器代码,不能更改build.xml或自定义构建任务。

任何人都可以提出一个方法,我可以做到这一点?

回答

1

你以错误的方式接近这一点。记录器应该无法涉及正在执行的任务。这是相反的方式。您的任务应该使用记录器记录消息。所以你的情况,你应该加强DoCompile任务(和其他任务已创建)注册的所有与记录的消息。所以在Execute方法里面只需要放一些Log.LogMessage(...)消息来记录你感兴趣的属性。

+0

谢谢,但不幸的是我无法为各种原因改变自定义任务的代码。 我真的不希望“伸入”任务,只要找到其中它的参数传递(以同样的方式我可以找出它的名字)。即使获得任务的对象引用也足以能够使用反射,尽管这只是一种破解。 我有不同的'Log.LogMessage()'正在通过从任务,但没有作为参数,以便不断呼吁'的LogMessage()'是相当含糊过 - 或许监听自定义事件可能是在一般情况下更好? – 2010-03-15 00:11:36