Как упаковать расширение на основе 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.