Расширение Visual Studio 2010 (.vsix), получение экземпляра DTE2 - PullRequest
4 голосов
/ 25 сентября 2010

У меня есть расширение Visual Studio 2010, файл .vsix. Я могу получить экземпляр DTE для моего конкретного экземпляра Visual Studio, который я подтверждаю печатью dte_instance.Solution.Fullname. Но для моего экземпляра DTE2, похоже, он дает мне информацию о неправильном экземпляре Visual Studio.

Вот рабочий процесс: среда разработки Visual Studio открыта, есть код для расширения. Запустите проект, который вызывает запуск нового экземпляра 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);

Я нашел несколько ссылок на получение объекта DTE2 в надстройке с помощью метода connect (), но не смог найти аналогичный обратный вызов для расширений.

Вопрос: как получить экземпляр DTE2 для IDE, в которой выполняется расширение?

Ответы [ 2 ]

12 голосов
/ 25 сентября 2010

Попробуйте это , который использует импортированный поставщик услуг, или просто используйте Package.GetGlobalService:

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

0 голосов
/ 10 июля 2014

У меня была проблема, что на некоторых машинах Package.GetGlobalService(typeof(DTE)) возвращал ноль.Теперь я использую (DTE2)base.GetService(typeof(DTE)) в методе пакета Package Initialize() (который аналогичен методу connect() надстройки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...