我有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以某种方式阻碍了这种行为,因为他们希望我自己破产并获得最终版本;)
有什么想法吗?
答案 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;
}