在Visual Studio IDE之外获取EnvDTE.DTE实例

Ana*_*i M 5 c# envdte visual-studio-2013

我在Visual Studio 2013中创建了一个项目自动化工具,我有自己的项目模板,我试图以编程方式将它添加到现有的解决方案中.我在控制台应用程序中使用以下代码.

EnvDTE.DTE dte = (EnvDTE.DTE)Marshal.GetActiveObject("VisualStudio.DTE.12.0");
string solDir = dte.Solution.FullName;
solDir=solDir.Substring(0, solDir.LastIndexOf("\\"));
dte.Solution.AddFromTemplate(path, solDir+"\\TestProj", "TestProj", false);
Run Code Online (Sandbox Code Playgroud)

当我从Visual Studio IDE运行应用程序时它正在工作.但是当我尝试从命令提示符运行exe时,我得到以下异常.

Unhandled Exception: System.Runtime.InteropServices.COMException: Operation unav
ailable (Exception from HRESULT: 0x800401E3 (MK_E_UNAVAILABLE))
at System.Runtime.InteropServices.Marshal.GetActiveObject(Guid& rclsid, IntPtr reserved, Object&   ppunk)
at System.Runtime.InteropServices.Marshal.GetActiveObject(String progID)
at ProjectAutomation.Console.Program.Main(String[] args) 
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以在Visual Studio IDE之外获取活动的EnvDTE.DTE实例.

Car*_*ero 5

从外部工具自动化现有的Visual Studio实例来修改加载的解决方案是一个坏主意.如果您使用GetActiveObject(...)并且启动了两个Visual Studio实例,您如何知道返回正确的实例?如果用户启动外部工具时用户或Visual Studio正在使用解决方案做些什么呢?有两种更好的方法:

1)使用外部工具自动化新的Visual Studio实例,加载所需的解决方案并进行修改.即使VS实例不可见,也可以这样做.要创建新实例,正确的代码是:

System.Type type = Type.GetTypeFromProgID("VisualStudio.DTE.12.0");
EnvDTE.DTE dte = (EnvDTE.DTE) System.Activator.CreateInstance(type);
dte.MainWindow.Visible = true;
...
Run Code Online (Sandbox Code Playgroud)

2)使用Visual Studio扩展,例如宏(VS 2010或更低版本),加载项(VS 2013或更低版本)或包(任何VS版本)来提供菜单项或按钮工具栏,单击该工具栏时,修改目前加载解决方案 这可以防止"忙"场景,因为如果VS忙,则无法单击菜单项或工具栏按钮(除非"忙"操作是异步的).