使用Visual Studio SDK创建项目时如何隐藏项目创建弹窗
问题描述
我正在使用C#基于Visual Studio SDK自动化创建Visual Studio项目,执行流程如下:
- 通过DTE接口启动Visual Studio实例
- 创建项目存放的新目录
- 生成解决方案文件
- 基于指定项目模板在解决方案下创建项目
使用的实现代码如下:
// 加载DTE接口 Type t = System.Type.GetTypeFromProgID("VisualStudio.DTE.16.0"); EnvDTE.DTE dte = (EnvDTE.DTE)System.Activator.CreateInstance(t); // 隐藏主界面 dte.SuppressUI = true; dte.MainWindow.Visible = false; // 创建工作目录 if (Directory.Exists(@"C:\Temp\SolutionFolder")) Directory.Delete(@"C:\Temp\SolutionFolder", true); Directory.CreateDirectory(@"C:\Temp\SolutionFolder"); Directory.CreateDirectory(@"C:\Temp\SolutionFolder\SolutionTemp"); // 创建解决方案 dynamic solution = dte.Solution; solution.Create(@"C:\Temp\SolutionFolder", "SolutionTemp"); solution.SaveAs(@"C:\Temp\SolutionFolder\SolutionTemp\MySolutionTemp.sln"); // 基于模板创建项目 string template = @"C:\TwinCAT\3.1\Components\Base\PrjTemplate\TwinCAT Project.tsproj"; // 项目模板路径 dynamic project = solution.AddFromTemplate(template, @"C:\Temp\SolutionFolder\SolutionTemp", "MyTmpProject");
代码可以正常执行,但创建项目环节会弹出项目创建窗口,截图如下:
需要实现该弹窗的完全隐藏,求可行方案。
补充说明:当前创建的是TwinCAT项目,这是一款基于Visual Studio的自动化IDE,该项目类型差异不影响问题本身。
可行解决方案
按稳定性从高到低排序:
方案1:跳过模板向导,直接导入项目文件(最稳定,优先选)
你碰到的弹窗是TwinCAT项目模板自带的向导弹窗,这类第三方项目向导基本不会遵守Visual Studio原生的SuppressUI约定,最稳妥的方式是完全绕过向导流程:
- 先把
.tsproj模板文件复制到目标项目路径,重命名为你设置的项目名(比如MyTmpProject.tsproj) - 替换模板文件内的占位内容:包括默认项目名、新生成的项目GUID、路径引用等
- 调用
solution.AddFromFile(修改后的项目文件完整路径)直接把项目加载到解决方案,全程不会触发任何向导弹窗。
方案2:补全DTE实例的交互抑制配置
很多人会漏掉DTE的UserControl属性配置,在初始化DTE的代码块里补充一行配置即可,部分场景下可以让第三方向导不弹出UI:
// 原有UI隐藏配置 dte.SuppressUI = true; dte.MainWindow.Visible = false; // 新增配置:禁止VS实例响应用户交互 dte.UserControl = false;
同时建议在DTE初始化后加短暂等待,确保配置完全生效后再执行后续操作:
// 等待DTE核心组件初始化完成 while (dte.Solution == null) { System.Threading.Thread.Sleep(100); }
方案3:后台自动处理弹出窗口
如果前两种方案不生效,可以在调用AddFromTemplate前启动一个后台线程,轮询查找弹出的创建窗口,找到后自动触发窗口确认逻辑或者直接隐藏窗口:
- 调用
AddFromTemplate前启动后台线程,设置为后台线程避免阻塞进程退出 - 线程内通过Windows API枚举当前VS进程的顶层窗口,通过窗口标题、类名匹配到项目创建弹窗
- 给窗口发送消息触发默认的确定按钮点击,或者直接发送隐藏窗口的系统消息即可。
内容的提问来源于stack exchange,提问作者Manu
相关产品推荐
相关产品推荐

