Получите правильный экземпляр VS2017 для собственного расширения - PullRequest
0 голосов
/ 26 октября 2018

Я разрабатываю расширение Visual Studio для замены текста в текущем активном .cs-файле с помощью пользовательской команды, которая вызывается из контекстного меню правой кнопки мыши в окне кода.

Доступ к документу пока работает, но если я запускаю более одного экземпляра VS2017, то изменения, которые я ожидаю сделать в новом экземпляре, вносятся в первый открытый экземпляр.

Существует ли возможность получить правильный экземпляр для доступа только к текущему активному документу, независимо от того, сколько экземпляров открыто?

На данный момент я получаю экземпляр со следующим кодом:

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

У кого-нибудь есть идеи, как это решить?

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Как уже сказал Карлос Кинтеро , вы должны получить объект 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.

0 голосов
/ 26 октября 2018

Вам необходимо использовать в классе вашего пакета (который наследуется от базового класса AsyncPackage):

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

Код, который вы использовали, возвращает некоторый экземпляр DTE, работающий в вашей системе, не обязательнотот, где ваше расширение размещено.

...