VS2019调用EnvDTE.DTE的AddFromFile添加项目报E_FAIL错误如何解决
错误原因
- 项目文件被占用:目标csproj已经被当前VS解决方案加载,或者被其他VS实例、第三方进程锁定,COM接口无法获得访问权限
- 线程模型不匹配:当前调用
AddFromFile的线程不是STA线程,也不是VS的主UI线程,EnvDTE的所有COM接口仅支持在VS主UI线程中调用 - VS缓存冲突:当前解决方案的本地缓存(.vs文件夹下的配置)存在已删除/失效的同名项目引用记录,导致添加时出现冲突
- 方法重载匹配异常:单参数的
AddFromFile在部分版本的Visual Studio SDK中存在默认参数绑定问题,默认的Exclusive参数值不符合现有解决方案的添加要求
解决方案
- 排查项目占用
检查当前解决方案是否已经存在同名/同路径的项目,已存在的话先调用Solution.Remove方法移除再执行添加逻辑;关闭其他打开的VS实例,检查并结束占用目标csproj的残留MSBuild、devenv进程后重试。 - 切换到VS主UI线程执行代码
如果是在VS扩展中调用,先切换到主线程再执行项目添加逻辑:
如果是外部进程调用EnvDTE,确保执行调用的线程标记了// 切换到VS主UI线程 await Microsoft.VisualStudio.Shell.ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(); // 后续执行EnvDTE相关操作[STAThread]属性。 - 清理VS解决方案缓存
关闭当前VS实例,删除解决方案根目录下的.vs隐藏文件夹,重新打开解决方案后再执行代码。 - 改用双参数重载的
AddFromFile方法
显式传入Exclusive参数为false,指定将项目添加到当前现有解决方案,而非打开为独占的新解决方案:EnvDTE.DTE dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE"); EnvDTE._Solution solution = dte.Solution; solution.AddFromFile(@"C:\NewestCode\TestingAutomation\src\UnitTestGeneration\UnitTestTemplate\UnitTestTemplate.csproj", false);
内容的提问来源于stack exchange,提问作者Adam Lee
相关产品推荐
相关产品推荐

