有了一些有限的成功,我可以在包管理器控制台中自动执行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命令)。 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/