Как упаковать расширение на основе VSIX для нескольких версий Visual Studio?

Я поддерживаю внутреннее расширение Visual Studio компании, которое упаковано и развернуто как контейнер VSIX. Это расширение в настоящее время предназначено для VS 2010. Он использует несколько VS API DLL и ссылается на версии VS 2010 из них.

В настоящее время я переношу это расширение для совместимости с VS 2012/2013. Я уже выяснил, что старый манифест VSIX можно отредактировать вручную, чтобы расширение было дополнительно установлено на VS 2012/2013 - это работает отлично.

Однако некоторые из API-интерфейсов VS 2010, которые я использую в настоящее время, несовместимы с VS 2012 ++, и мне нужно их обновить - в результате отказа от обратной совместимости.

Мой вопрос: как мне структурировать мое решение и VSIX, чтобы он был совместим с VS 2010, 2012 и 2013 годами. Будет ли он работать с одним DLL-таргетингом VS 2010 и одним таргетингом DLL на VS 2012/2013? и выбрать тот, который будет использоваться при продолжительном времени загрузки?

Боковое примечание. Я использую MEF для создания своих внутренних функциональных блоков. Способствует ли это каким-либо образом?

Ответ 1

Вы можете:

  • отделить функциональность, открытую двумя сборками, специфичными для версии, в специальном интерфейсе (который вы можете поместить в сборку хоста, если хотите), как вы можете делать с любым другим плагином MEF; позвоните ему IDoWork;
  • реализовать вышеупомянутый интерфейс в двух конкретных типах, открытых двумя различными сборками, по одному для каждой версии VS, которую вы поддерживаете, например. DoWorkVs2010 и DoWorkVs2012;

    • AssemblyForVS2010.dll - > DoWorkVs2010: IDoWork
    • AssemblyForVS2012.dll - > DoWorkVs2012: IDoWork

. 3. (необязательно) [Export] два типа, чтобы сделать их доступными через MEF; например:.

    [Export(typeof(IDoWork))]
    class DoWorkVs2010 : IDoWork
    {
        // ...
    }

4. добавьте factory к вашей сборке хоста (тот, который загружается непосредственно с вашим VSX), и оттуда создайте конкретный тип, который вы ищете, на основе версии DTE:

    static class DoWorkFactory
    {
        internal static IDoWork Build()
        {
            // Load the version-specific assembly

            // - Via reflection (see http://stackoverflow.com/a/465509/904178)
            // - Or via MEF

            return ...;
        }
    }

Ответ 2

Используйте эти шаблоны VSIX от Jared Par. Они разработаны с целью сделать ваш проект VSIX доступным и доступным в нескольких версиях VS. Похоже, им может понадобиться освежение для VS2015, но они определенно являются местом для начала разработки VSIX.