【发布时间】: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();
}
- 当某些操作完成时,是否有某种方法可以消除等待并订阅某些事件?我对上面的
WAIT 2和WAIT 3特别好奇,它们会在PMC命令之后发生(先打开它,然后调用PS命令)。 - 不相关,有没有一种方法可以在不激活 VS 窗口的情况下完成所有这些操作?我怀疑不是,因为没有
dte.MainWindow.Activate()会出现异常。
我的最终目标是能够为给定的包和解决方案运行具有特定版本的 Update-Package,尽管运行任意 PMC 命令也会有其他优势。不幸的是,nuget.exe 没有提供传递版本 AFAIK 的选项。对于大型解决方案,更新可能需要一段时间,因此无法知道何时完成。
【问题讨论】:
-
你找到办法了吗?
-
不,这是我在旁边玩的东西,所以我放弃了。在我们的例子中,我们现在使用 nuget.exe 进行了一些自动化(意识到它的局限性),但当然能够在 VS 之外执行 PMC 命令是理想的。
标签: visual-studio powershell nuget envdte