Ключевое слово здесь " надежно ".
Когда я создаю решение и добавляю несколько проектов, я получаю исключение:
Unhandled Exception: System.Runtime.InteropServices.COMException: The message
filter indicated that the application is busy. (Exception from HRESULT:
0x8001010A (RPC_E_SERVERCALL_RETRYLATER))
at EnvDTE.Project.get_Object()
Как уродливый хак, я добавил Thread.Sleep
, чтобы избежать тайм-аутов, и это работает, но, конечно, это не решение само по себе. Так как же я могу надежно добавлять проекты в решение, то есть без явных снов и, с другой стороны, без таймаутов?
Я использую VS 2017 и создаю экземпляр и решение VS следующим образом:
System.Type type = System.Type.GetTypeFromProgID("VisualStudio.DTE.15.0",
throwOnError: true);
Object obj = System.Activator.CreateInstance(type, nonPublic: true);
var dte = (EnvDTE80.DTE2)obj;
dte.MainWindow.Visible = true; // optional if you want to See VS doing its thing
// create a new solution
dte.Solution.Create(sln_path, sln_name);
var solution = (EnvDTE80.Solution2)dte.Solution;
Имея решение под рукой, я делаю петлю так:
- Я звоню
solution.AddFromTemplate
, поэтому я получаю VSLangProj.VSProject
- когда мне это нужно, я добавляю ссылки на текущий проект
curr_prj.References.AddProject(other_prj)
Без сна я получаю таймаут прямо перед первым добавлением ссылки, поэтому, как минимум, я могу добавить первый проект, второй проект, а затем у меня есть тайм-аут на добавление ссылки на первый проект.