Visual Studio 2010扩展(.vsix),获取DTE2实例

时间:2010-09-24 21:25:48

标签: visual-studio-2010

我有一个Visual Studio 2010扩展名,一个.vsix文件。我可以获取我的Visual Studio特定实例的DTE实例,我通过打印dte_instance.Solution.Fullname来确认。但是对于我的DTE2实例,它似乎向我提供了有关错误的Visual Studio实例的信息。

这是工作流程:Visual Studio开发IDE打开,具有扩展的代码。启动项目,这将导致启动一个新的Visual Studio实例,其中安装了扩展。单击运行以下代码的菜单按钮(在新IDE中):

DTE dte;
DTE2 dte2, dte2Macros;
dte = (DTE)GetService(typeof(DTE));
dte2 = (DTE2)System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE.10.0");
dte2Macros = (DTE2)dte2.MacrosIDE;

//this returns what I expect, the solution name in the newer IDE.
MessageBox.Show("solution name: " + dte.Solution.FullName);

//code to get the startup project from MSDN
//http://msdn.microsoft.com/en-us/library/ms228782.aspx
SolutionBuild2 sb = (SolutionBuild2)dte2.Solution.SolutionBuild;
string msg = "";
Int32 configs = sb.SolutionConfigurations.Count;
foreach (String item in (Array)sb.StartupProjects)
{
    msg += item;
}

//this returns a project from the development IDE, the one I don't want.
System.Windows.Forms.MessageBox.Show("startup project is: " + msg);
Project startupProject = dte2.Solution.Item(msg);

我发现了几个使用connect()方法在addin中获取DTE2对象的引用,但我找不到类似的扩展回调。

问题:如何为扩展正在执行的IDE获取DTE2实例?

2 个答案:

答案 0 :(得分:12)

尝试使用导入的服务提供商的this,或者只使用Package.GetGlobalService

DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;

答案 1 :(得分:0)

我遇到的问题是某些机器Package.GetGlobalService(typeof(DTE))返回null。 现在我在包的(DTE2)base.GetService(typeof(DTE))方法中使用Initialize()(类似于加载项的connect()方法)。