2010-03-14 77 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