Как расширение VS может использовать несколько версий в отношении Microsoft.VisualStudio.* ссылки?

несколько расширений, которые я использую, сломаны под VS2012, потому что в какой-то момент они были обновлены для работы с VS2013, изменив версию ссылочных библиотек. Во время выполнения может возникнуть такая ошибка:

не удалось загрузить файл или сборку 'Microsoft.VisualStudio.Ракушка.12.0, Version=12.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a' или одна из его зависимостей. Система не может найти файл указанный.

  • Я вижу различные расширения, ссылающиеся на несколько версий одной и той же библиотеки:

    <Reference Include="Microsoft.VisualStudio.Shell.Interop" />
    <Reference Include="Microsoft.VisualStudio.Shell.Interop.8.0, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    <Reference Include="Microsoft.VisualStudio.Shell.Interop.9.0, Version=9.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
    
  • другие выпускают расширение на версию VS.

  • другой вариант, согласно в этой статье, динамически загружать правильную версию.

Я хотел бы помочь исправить эти расширения, но как правильно решить эту проблему?

2 ответов


таким образом, ссылочные сборки Visual Studio разбиваются на несколько разных категорий, которые вы должны обрабатывать по-разному в зависимости от категории:

  • сборок: это те, как взаимодействие.* сборки, перечисленные в вашем вопросе. Каждая сборка взаимодействия-это не более новая версия "того же", а сборка, содержащая все com-интерфейсы, добавленные в этой версии Visual Studio. Ссылки на старые версии в порядке, просто не ссылайтесь на более новую, чем самая низкая версия Visual Studio, которую вы хотите настроить
  • редактор сборки, Roslyn: все, что связано с основным текстовым редактором (сборки Microsoft.VisualStudio.Текст.Данных Microsoft.VisualStudio.Текст.UI, Microsoft.VisualStudio.Текст.ПОЛЬЗОВАТЕЛЬСКИЙ ИНТЕРФЕЙС.Wpf и Microsoft.VisualStudio.Редактор) и Roslyn Visual Studio включает перенаправления сборки, которые перенаправляют любую версию, на которую вы ссылаетесь, на версию VS, которую вы на самом деле работает на. Еще раз выберите самую низкую версию, которую вы собираетесь поддерживать.
  • Microsoft.VisualStudio.Ракушка.[версия]: это очень смущает людей. Как эта конкретная сборка работает для каждой версии Visual Studio, которая поставляется, создается новое имя сборки (с версией в сборке). Затем в будущих версиях Visual Studio мы отправляем более новую версию целевой сборки. Итак, еще раз, убедитесь, что вы нацелены Microsoft.VisualStudio.Ракушка.[версия] с самой низкой версией, которую вы собираетесь поддерживать.

хитрая проблема здесь-vssdk project upgrader любит обновлять ваши проекты до более новых версий. Привыкайте редактировать файлы MSBuild вручную, чтобы убедиться, что он этого не делает, или понизить то, что он уже сделал. Для окончательного VSIX, который вы отправляете пользователям, часто лучше всего либо строить с более старой версией VS, чтобы убедиться, что он не собирает новые вещи случайно. Если вы хотите использовать только более новая версия, то вам придется найти VS двоичные файлы из старой версии, которую вы хотите использовать и проверить их в вашей системе управления версиями, чтобы убедиться, что старые версии все еще подбираются. Проверьте свой VSIX, если вы идете по этому маршруту, так как легко ошибиться и случайно сослаться на что-то новое.


Я написал статью о различных политиках управления версиями сборок, используемых сборками Visual Studio.

http://tunnelvisionlabs.github.io/vsbase/docs-master/html/edbfd3ce-43f4-4f3f-a90c-bc22bda19fae.htm

кроме того,VSSDK.* Пакеты NuGet используйте объявления зависимостей, чтобы определить версии Visual Studio, с которыми может использоваться каждое расширение.

конкретная версия Microsoft.VisualStudio.Оболочка, на которую вы ссылаетесь, является версионной сборкой (в предыдущей статье) и включена в VSSDK.Ракушка.12 пакет, со следующим описанием:

этот пакет предоставляет справочную сборку Visual Studio "Shell", используемую Visual Studio 2013 и новее.

чтобы легко ориентироваться как на Visual Studio 2012, так и на Visual Studio 2013, используйте NuGet для управления зависимостями VS SDK и обеспечения следующих условий держите:

  1. убедитесь, что ваша сборка не зависит от VSSDK.ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ.12 пакета NuGet. Эта зависимость означает, что одна или несколько сборок, на которые ссылается проект, работают только с Visual Studio 2013 и новее.
  2. убедитесь, что ваша сборка не зависит от VSSDK.ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ.10Only, VSSDK.ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ.11Only или VSSDK.ИНТЕГРИРОВАННАЯ СРЕДА РАЗРАБОТКИ.12Only. Они указывают, что ваш пакет ссылается на один или несколько сборки,только работа с определенной версией Visual Studio.

В идеале вы хотели бы установить только пакеты Vssdk NuGet, которые включают оба в VS2012 и vs2013 теги.