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

标签 visual-studio powershell nuget envdte

有了一些有限的成功,我可以在包管理器控制台中自动执行VS以执行任意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();
}
  • 是否可以通过某些方法在完成某些操作后删除等待并订阅某些事件?我对以上的WAIT 2WAIT 3尤其好奇,它们会在PMC命令之后发生(首先打开它,然后调用PS命令)。
  • 不相关地,有没有一种方法可以不必使VS窗口处于 Activity 状态而执行所有这些操作?我怀疑不是,因为我没有dte.MainWindow.Activate()就会遇到异常。

  • 我的最终目标是能够为给定的软件包和解决方案运行具有特定版本的Update-Package,尽管运行任意PMC命令也将具有其他优势。不幸的是nuget.exe没有提供传递AFAIK版本的选项。对于大型解决方案,此更新可能需要一段时间,因此没有很好的方法来知道何时完成。

    最佳答案

    一个想法是,您仍然可以使用Sleep方法,但是时间较短,例如,添加“for”循环10次,每次仅扭曲1000 ms,然后使用一种方法来检查是否有像VS这样的进程Windows至少使用C#代码(sample)运行,它将优化性能。

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

    关于visual-studio - 使用EnvDTE自动化Visual Studio时确定Package Manager控制台已准备就绪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38915071/

    相关文章:

    c++ - Visual Studio 2015 C++ 编译时卡住计算机直到编译完成

    .net - NuGet:自动迁移对包的引用

    visual-studio-code - nuget包的本地来源不存在

    asp.net - 如何查找 IIS 功能的名称

    iis - 使用 Powershell 在不是应用程序的文件夹中创建 Web 应用程序

    asp.net-mvc - 无法找到包 ""的版本 ""

    C# - 将大型 (150MB) 文本文件读入富文本框

    visual-studio - 调试-使用断点跳过代码

    visual-studio - Visual Studio 2013 : How to copy a project's properties to use in another project?

    powershell - 确定执行 finally 时是否从 try block 中抛出异常