此处的关键词是“ 可靠”。
当我创建解决方案并添加几个项目时,我会得到一个例外:
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)
的引用没有睡眠,我在第一次添加引用之前就已经超时,因此至少我可以添加第一个项目,第二个项目,然后在向第一个项目添加引用时就有超时。
答案 0 :(得分:1)
尝试实现IOleMessageFilter错误处理程序。
请参阅:
如何:修复“应用程序忙”和“被呼叫者拒绝呼叫”错误 https://msdn.microsoft.com/en-us/library/ms228772.aspx