2013-08-29 160 views
0

我有VS2012專業人員,非常喜歡我在構建結束時運行的精細測試。vs Addin失敗,試圖執行命令

我想我可以通過很簡單地編寫一個插件來完成。所以我有一個C#插件。

public void OnConnection(object app, ext_ConnectMode cM, object aI, ref Array cust) { 
    _applicationObject = (DTE2)app; 
    _addInInstance = (AddIn)aI; 
    if (_applicationObject != null) { 
     _bldevents = _applicationObject.Events.BuildEvents; 
     _bldevents.OnBuildDone += _bldevents_OnBuildDone; 
    } 
} 

void _bldevents_OnBuildDone(vsBuildScope Scope, vsBuildAction Action) { 
    try { 
     _applicationObject.ExecuteCommand("TestExplorer.RunAllTests"); 
    } catch(Exception e) { 
     string d = " + " + e.HResult; 
     Clipboard.SetText(e.Message + " ~ " + e.HResult); 
     MessageBox.Show(e.Message); 
    } 
} 

但是當我做了構建我的錯誤錯誤HRESULT E_FAIL已經從COM組件的調用返回。 〜-2147467259

ExecuteCommand在File.NewFile之類的東西上運行TestExplorer.RunAllTests在命令窗口中沒有任何問題。

有一些設置需要做什麼或有MS某種程度上阻礙的行爲,因爲他們要我自己破產並獲得最終的版本;)

有什麼想法?

回答

0

它看起來像TestExplorer.RunAllTests首先執行構建,再次調用_bldevents_OnBuildDone,再次調用TestExplorer.RunAllTests並且第二次拋出異常。

您可以添加IsCommandAvailable檢查,以防止這種遞歸:

if (IsCommandAvailable("TestExplorer.RunAllTests")) 
       _applicationObject.ExecuteCommand("TestExplorer.RunAllTests"); 

bool IsCommandAvailable(string command) 
{ 
    Commands2 commands = (Commands2)(_applicationObject.Commands); 
    if (commands == null) 
     return false; 

    Command dte_command = commands.Item(command, 0); 
    if (dte_command == null) 
     return false; 

    return dte_command.IsAvailable; 
}