如何以编程方式可靠地将项目添加到解决方案

时间:2018-11-05 10:23:34

标签: visual-studio timeout envdte

此处的关键词是“ 可靠”。

当我创建解决方案并添加几个项目时,我会得到一个例外:

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 :(得分:1)

尝试实现IOleMessageFilter错误处理程序。

请参阅:

如何:修复“应用程序忙”和“被呼叫者拒绝呼叫”错误 https://msdn.microsoft.com/en-us/library/ms228772.aspx