Как надежно добавлять проекты в решение программно - PullRequest
0 голосов
/ 05 ноября 2018

Ключевое слово здесь " надежно ".

Когда я создаю решение и добавляю несколько проектов, я получаю исключение:

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)

Без сна я получаю таймаут прямо перед первым добавлением ссылки, поэтому, как минимум, я могу добавить первый проект, второй проект, а затем у меня есть тайм-аут на добавление ссылки на первый проект.

1 Ответ

0 голосов
/ 05 ноября 2018

Попробуйте реализовать обработчики ошибок IOleMessageFilter.

См:

Как исправить ошибки «Приложение занято» и «Ошибка отклонена вызовом» https://msdn.microsoft.com/en-us/library/ms228772.aspx

...