Visual Studio VSIX OnSolutionOpened не работает

Я пытаюсь реализовать какое-то расширение стартовой страницы для Visual Studio. Основной целью было бы поместить Инструкции и Рекомендации для конкретных проектов в компании, в которой я работаю, запуская локальный HTML-файл каждый раз, когда открывается решение. Я начал с использования Visual Commander ( https://vlasovstudio.com/visual-commander/extensions.html), который работал отлично. Но я хотел вместо этого сделать файл VSIX. После некоторых исследований я сгенерировал код, но если я отлаживаю или напрямую устанавливаю vsix из папки отладки, ничего не происходит (даже если я выкидываю исключение в первой строке). Код довольно прост:

 #region Package Members

    DTE DTE;

    /// <summary>
    /// Initialization of the package; this method is called right after the package is sited, so this is the place
    /// where you can put all the initialization code that rely on services provided by VisualStudio.
    /// </summary>
    protected override void Initialize()
    {
        base.Initialize();
        try
        {
            IServiceContainer serviceContainer = this as IServiceContainer;
            DTE = serviceContainer.GetService(typeof(SDTE)) as DTE;
            EnvDTE.Events events = DTE.Events;
            EnvDTE.SolutionEvents solutionEvents = events.SolutionEvents;
            solutionEvents.Opened += OnSolutionOpened;
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    private void OnSolutionOpened()
    {
        try
        {
            string startupFile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(DTE.Solution.FullName), GetSolutionStartPage());
            if (System.IO.File.Exists(startupFile))
            {
                DTE.ItemOperations.Navigate(startupFile);
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    string GetSolutionStartPage()
    {
        return ((DTE.Solution != null) ? System.IO.Path.GetFileNameWithoutExtension(DTE.Solution.FullName) : "") + ".html";
    }

    #endregion

2 ответа

Решение

Вы должны указать с атрибутом выше метода Initialize(), когда VS должен загрузить ваш пакет.

Вы, вероятно, хотите этот атрибут:

[ProvideAutoLoad(VSConstants.UICONTEXT.NoSolution_string)]

Чтобы просмотреть список всех возможных атрибутов загрузки, посетите страницу https://www.mztools.com/articles/2013/MZ2013027.aspx

Не забудьте переместить объявление solutionEvents на уровне класса, а не на уровне метода, иначе ваш следующий вопрос будет работать только некоторое время (из-за сборки мусора). См. https://msdn.microsoft.com/en-us/library/envdte.solutionevents.aspx

Другие вопросы по тегам