【问题标题】:vs Addin failing trying to Execute commandvs Addin 尝试执行命令失败
【发布时间】:2013-08-29 17:36:32
【问题描述】:

我有 VS2012 专业版,非常希望在构建结束时运行经过精心打磨的测试。

我认为我可以通过非常简单地编写一个插件来做到这一点。所以我在 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 以某种方式阻碍了这种行为,因为他们希望我破产并获得最终版本;)

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    看起来 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-01
      • 2017-11-12
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多