Как я могу получить текущий каталог Projects & Solutions из настроек VS 2017 и загрузить решение с помощью SDK? - PullRequest
0 голосов
/ 20 мая 2018

Я создал собственное расширение окна инструмента для VS 2017. Все работает, кроме двух вещей:

Мне нужно получить "Местоположение проектов" из Инструменты / Параметры / Проекты и решения / Местоположения.

Мне также нужно сообщить текущему экземпляру VS, чтобы загрузить решение или проект.

Я искал несколько дней в VS SDK и не смог придумать много,Я получил это далеко:

ShellSettingsManager sm = new ShellSettingsManager();

Но для этого нужен один из двух интерфейсов в качестве параметра, IVsSettingsManager или IServiceProvider.

Я реализую интерфейс и, конечно, он создает методы, все они закодированыс нереализованными исключениями.

Так что, поскольку я здесь совершенно невежественен, я надеюсь, что кто-то может указать мне правильное направление, если не просто прямо показать мне, как это сделать.

1 Ответ

0 голосов
/ 02 июня 2018

Я наконец понял это.Существует ServiceProvider, который вы можете предоставить конструктору для ShellSettingsManager.Все примеры, которые я видел, только что использовались:

SettingsManager sm = new ShellSettingsManager(ServiceProvider);

Но когда я попробовал это, я получил "ServiceProvider - тип, который недопустим в данном контексте"

Я наконецнашел пример, который использовал:

SettingsManager sm = new ShellSettingsManager(ServiceProvider.GlobalProvider);

Тот же самый пример затем продолжился ...

SettingsStore ss = sm.GetReadOnlySettingsStore(SettingsScope.UserSettings);

Вот где я должен был выяснить все остальное для себя.

В SettingsStore есть два перечислимых: GetPropertyNames и GetSubCollectionNames.Они полезны, чтобы найти коллекцию и собственность, в которой я нуждаюсь.Итак, сначала я сделал это:

        string msg = "";
        foreach (string s in ss.GetPropertyNames(""))
        {
            msg += s + "\r\n";
        }
        MessageBox.Show(msg);

Пустая строка в качестве параметра получает свойства корневой коллекции, и это было то, что мне нужно.

screenshot of messagebox

Итак, теперь я наконец-то получил нужное мне значение.

string DefaultNewProjectLocation = Environment.ExpandEnvironmentVariables(ss.GetString("", "DefaultNewProjectLocation"));

Первый параметр, пустая строка, является корневой коллекцией, а 2-й параметр - это свойство, которое я хочу.Он вернул:

%USERPROFILE%\source\repos

Расширение переменной среды дает мне буквальный путь.

Теперь давайте разберемся, как получить текущий экземпляр VS для загрузки проекта, выбранного в моем окне инструментов..

Редактировать: После еще одного полного дня поиска, наконец, получил Visual Studio, чтобы загрузить проект в экземпляр, на котором запущено мое расширение.Несколько человек сказали мне использовать Process.Start и передать путь к файлу решения, но это запустило другой экземпляр Visual Studio и загрузило его туда.

Я нашел DTE.ExecuteCommand (строка Command, строка Args)но не знал, будет ли это то, что мне нужно.Затем я прочитал что-то, что говорит, что он выполняет команды, доступные в разделе Инструменты / Параметры / Среда / Клавиатура.Я пролистал там и нашел «File.OpenProject» и решил, что могу отправить файл решения в качестве аргумента.Но на этом пути возникла еще одна проблема ...

Добавление ссылки на EnvDTE и попытка сделать это:

DTE.ExecuteCommand("File.OpenProject", "\"" + PathToSlnFile + "\"");

Просто выдал ошибку, которая сказала:

ссылка на объект требуется для нестатического поля, метода или свойства '_DTE.ExecuteCommand (string, string)'

Я пытался создать его экземпляр

var dte = new DTE();

Но это просто дало мне ошибку во время выполнения из-за невозможности прочитать что-то о библиотеке COM.Я нашел миллион примеров использования DTE.ExecuteCommand, но ни один из них не показал, как получить ссылку на него.Я нашел это в Google Книгах, «Освоение Visual Studio .NET: получение максимальной отдачи от среды Visual Studio .NET»

Способ получения ссылки на объект DTE будет зависетьна какой тип кода вы пишете.Макросы просто используют глобальную переменную, предоставляемую макросредой, которая называется DTE.Надстройки передают ссылку на этот объект, когда VS.NET их инициализирует.

Хорошо, это все еще ничего не говорит мне.Как мне получить эту ссылку?!?

И тогда мне повезло.Я наконец наткнулся на случайную страницу (я бы связал ее, но я уже закрыл ее и не думаю, что когда-нибудь смогу найти ее снова).Это дало мне то, что мне было нужно.

private DTE dte = Package.GetGlobalService(typeof(DTE)) as DTE;

И теперь я могу сделать это, и это доставляет удовольствие!

dte.ExecuteCommand("File.OpenProject", "\"" + PathToSolutionFile + "\""); 

Надеюсь, это спасет некоторых других бедняжек вроде меня отпотратив три полных дня на поиски и ничего не находя в набеге на написание расширения Visual Studio.

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