В настоящее время я разрабатываю свое первое расширение VS, которое должно предоставить пользователю некоторые параметры. После https://msdn.microsoft.com/en-us/library/bb166195.aspx, было довольно легко создать собственную страницу параметров. Однако пока не научился читать свои варианты.
Структура решения моего расширения выглядит следующим образом:
MySolution
MyProject (generates a DLL from C# code)
MyProjectVSIX
Следуя приведенному выше руководству, я добавил VS Package
в свой проект VSIX и настроил его, как описано. В результате моя страница параметров с моими параметрами отображается в разделе Инструменты / Параметры. Отлично! Вот моя DialogPage
реализация:
public class OptionPageGrid : DialogPage
{
private bool myOption = false;
[Category(Options.CATEGORY_NAME)]
[DisplayName("My option")]
[Description("Description of my option.")]
public bool MyOption
{
get { return myOption; }
set { myOption = value; }
}
}
А вот голова моего класса Package:
[PackageRegistration(UseManagedResourcesOnly = true)]
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] [Guid(MyOptionsPage.PackageGuidString)]
[SuppressMessage("StyleCop.CSharp.DocumentationRules", "SA1650:ElementDocumentationMustBeSpelledCorrectly", Justification = "pkgdef, VS and vsixmanifest are valid VS terms")]
[ProvideOptionPage(typeof(OptionPageGrid), Options.CATEGORY_NAME, Options.PAGE_NAME, 0, 0, true)]
public sealed class MyOptionsPage : Package, IOptions
{
...
Однако теперь я хочу прочитать эти параметры, и я хочу сделать это из MyProject (который не зависит от MyProjectVSIX). И здесь я как бы потерялся. Моя первая попытка состояла в том, чтобы позволить моему Package
реализовать интерфейс IOptions
и позволить ему зарегистрироваться, вызвав статический метод Options.Register(IOptions)
из конструктора Package
. Это работает (т. Е. Достигнута точка останова в Register()
), но когда я пытаюсь прочитать параметры, статический экземпляр IOptions
по-прежнему имеет значение null. Я предполагаю, что это связано с тем, что код выполняется из разных процессов (что находится вне моего контроля).
После еще нескольких поисков в Google я попытался получить экземпляр объекта DTE
(который позволил бы мне прочитать мои параметры, если я правильно понял), но безуспешно. Я пробовал несколько вариантов, в том числе описанный на https://msdn.microsoft.com/en-us/library/ee834473.aspx и
DTE Dte = Package.GetGlobalService(typeof(DTE)) as DTE;
Я всегда получаю нулевую ссылку.
Наконец, поскольку в руководстве предлагалось получить доступ к параметрам через экземпляр Package
, я попытался выяснить, как получить такой экземпляр моего VS Package
через какой-то реестр (который я мог затем преобразовать в IOptions
), но снова безуспешно .
Кто-нибудь может указать мне правильное направление? Или вообще невозможно получить доступ к параметрам VS из проекта, отличного от VSIX?
Обновление: я провел еще несколько исследований, и одна часть информации была пропущена: мое расширение - это адаптер модульного тестирования. Похоже, это означает, что код обнаружения теста, а также код выполнения теста запускаются из разных процессов, т.е. мое предположение было правильным.
Тем временем мне удалось получить доступ к объекту DTE
экземпляра VS, в котором я работаю (я опубликую его со своим полным решением, как только моя проблема будет решена), но все еще имею проблемы с доступом к параметрам. Фактически, следующий код (скопированный отсюда: https://msdn.microsoft.com/en-us/library/ms165641.aspx) отлично работает:
Properties txtEdCS = DTEProvider.DTE.get_Properties("TextEditor", "CSharp");
Property prop = null;
string msg = null;
foreach (EnvDTE.Property temp in txtEdCS)
{
prop = temp;
msg += ("PROP NAME: " + prop.Name + " VALUE: " + prop.Value) + "\n";
}
MessageBox.Show(msg);
Однако, если я изменю приведенное выше следующим образом:
Properties txtEdCS = DTEProvider.DTE.get_Properties(CATEGORY_NAME, PAGE_NAME);
Теперь код вылетает. Как ни странно, я вижу свою категорию собственности и страницу в реестре под HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0Exp_Config\AutomationProperties\My Test Adapter\General
. Поиск моих свойств показывает их под HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\14.0Exp\ApplicationPrivateSettings\MyProjectVSIX\OptionPageGrid
(мэбай, потому что я добавил
OptionPageGrid Page = (OptionPageGrid)GetDialogPage(typeof(OptionPageGrid));
Page.SaveSettingsToStorage();
к методу Package
Initialize()
(как предложил Матце), может быть, потому, что я не заглядывал туда раньше :-)).
Итак, как читать мои свойства?