【问题标题】:Determining that Package Manager Console is ready when automating Visual Studio using EnvDTE在使用 EnvDTE 自动化 Visual Studio 时确定包管理器控制台已准备就绪
【发布时间】:2016-12-19 07:07:50
【问题描述】:

通过一些有限的成功,我能够自动化 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();
}
  1. 当某些操作完成时,是否有某种方法可以消除等待并订阅某些事件?我对上面的WAIT 2WAIT 3特别好奇,它们会在PMC命令之后发生(先打开它,然后调用PS命令)。
  2. 不相关,有没有一种方法可以在不激活 VS 窗口的情况下完成所有这些操作?我怀疑不是,因为没有dte.MainWindow.Activate() 会出现异常。

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

【问题讨论】:

  • 你找到办法了吗?
  • 不,这是我在旁边玩的东西,所以我放弃了。在我们的例子中,我们现在使用 nuget.exe 进行了一些自动化(意识到它的局限性),但当然能够在 VS 之外执行 PMC 命令是理想的。

标签: visual-studio powershell nuget envdte


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2016-05-30
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多