为自己开发的扩展获取正确的VS2017实例

时间:2018-10-26 13:42:56

标签: c# .net visual-studio-extensions

我正在开发Visual Studio扩展,以使用从代码窗口的右键单击上下文菜单中调用的自定义命令来替换当前活动.cs文件中的文本。

到目前为止,访问文档的工作正常,但是如果我启动多个VS2017实例,那么我希望在新实例中完成的更改将在第一个打开的实例中进行。

无论打开了多少实例,是否都有可能获得正确的实例以仅访问当前活动文档?

目前,我使用以下代码获取实例:

dte = (EnvDTE.DTE)System.Runtime.InteropServices.Marshal
    .GetActiveObject("VisualStudio.DTE.15.0");    

有人知道如何解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

您需要在包的类中使用(继承自AsyncPackage基类):

EnvDTE.DTE dte = (EnvDTE.DTE) base.GetService(typeof(Microsoft.VisualStudio.Shell.Interop.SDTE));

您使用的代码将返回一些在系统上运行的DTE实例,而不一定是托管您的扩展程序的那个实例。

答案 1 :(得分:0)

正如Carlos Quintero所述,您应该使用他的示例获取DTE对象。

让我们说您的扩展名是YourExtension:

就我而言,我在YourExtension.cs中添加了一个属性

 public EnvDTE.DTE DTEObject { get; set; }

然后在YourExtension Package .cs中,您可以在初始化程序包后立即获得所需的DTEObject:

protected override void Initialize ()
{
  YourExtension.Initialize (this);
  base.Initialize ();
  YourExtension.Instance.DTEObject = (EnvDTE.DTE)base.GetService (typeof (Microsoft.VisualStudio.Shell.Interop.SDTE));
}

现在,您可以在扩展程序中使用DTEObject并通过GetObject获取任何对象。以我为例,我正在获取VersionControlEx的当前实例。