通过一些有限的成功,我能够自动化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();
}
WAIT 2
和WAIT 3
特别感到好奇,这将在PMC命令之后发生(首先打开它,然后再调用PS命令)。dte.MainWindow.Activate()
的情况下得到了例外。我的最终目标是能够针对给定的包和解决方案运行具有特定版本的Update-Package,尽管运行任意PMC命令也具有其他优点。不幸的是,nuget.exe没有提供传入AFAIK版本的选项。对于大型解决方案,更新可能需要一段时间,因此没有好的方法可以知道它何时完成。
答案 0 :(得分:0)
一个想法是你仍然可以使用Sleep方法,但是时间很短,例如,添加一个“for”循环10次,每次只需wart 1000 ms,并使用方法检查是否有一个进程就像VS Windows使用C#代码(sample)运行一样,至少它会优化性能。
对于Nuget软件包更新,与上述建议类似的步骤,您可以使用C#代码获取软件包版本号,只需比较版本号。