vs Addin尝试执行命令失败

时间:2013-08-29 17:36:33

标签: c# visual-studio-2012 add-in

我有VS2012专业版,非常喜欢我精心打磨的测试,以便在构建结束时运行。

我以为我可以通过简单地写一个插件来做。所以我在c#addin中有这个。

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以某种方式阻碍了这种行为,因为他们希望我自己破产并获得最终版本;)

有什么想法吗?

1 个答案:

答案 0 :(得分: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;
}