使用EnvDTE自动化Visual Studio时确定Package Manager控制台已准备就绪

时间:2016-08-12 09:54:57

标签: visual-studio powershell nuget envdte

通过一些有限的成功,我能够自动化VS以在Package Manager控制台中执行一些任意的PS。以下是我到目前为止运行的代码:

MessageFilter.Register()
try
{
    var type = Type.GetTypeFromProgID("VisualStudio.DTE.14.0");
    var comObj = Activator.CreateInstance(type);
    var dte = (DTE2) comObj;
    try
    {
        dte.MainWindow.Activate();

        Thread.Sleep(10000); // WAIT 1

        dte.Solution.Open("path/to/sln");
        dte.ExecuteCommand("View.PackageManagerConsole");

        Thread.Sleep(10000); // WAIT 2

        dte.ExecuteCommand("View.PackageManagerConsole", "Start-Sleep -Seconds 10")

        Thread.Sleep(10000); // WAIT 3

        dte.Solution.Close();
    }
    finally
    {
        dte.Quit()
    }
}
finally
{
    MessageFilter.Revoke();
}
  1. 有些方法可以在某些操作完成后删除等待并订阅某些事件吗?我对上面的WAIT 2WAIT 3特别感到好奇,这将在PMC命令之后发生(首先打开它,然后再调用PS命令)。
  2. 无关紧要,有没有办法在不必让VS窗口激活的情况下完成所有这些操作?我怀疑没有,因为我在没有dte.MainWindow.Activate()的情况下得到了例外。
  3. 我的最终目标是能够针对给定的包和解决方案运行具有特定版本的Update-Package,尽管运行任意PMC命令也具有其他优点。不幸的是,nuget.exe没有提供传入AFAIK版本的选项。对于大型解决方案,更新可能需要一段时间,因此没有好的方法可以知道它何时完成。

1 个答案:

答案 0 :(得分:0)

一个想法是你仍然可以使用Sleep方法,但是时间很短,例如,添加一个“for”循环10次,每次只需wart 1000 ms,并使用方法检查是否有一个进程就像VS Windows使用C#代码(sample)运行一样,至少它会优化性能。

对于Nuget软件包更新,与上述建议类似的步骤,您可以使用C#代码获取软件包版本号,只需比较版本号。