Visual Studio Ссылки и управление версиями - как это работает? - PullRequest
13 голосов
/ 09 октября 2008

У нас есть несколько общих библиотек. В идеале мы хотим, чтобы все они использовали последнюю версию библиотеки DLL, даже если они были скомпилированы для более старой версии (предположим, что последняя версия обратно совместима)

например, у нас есть:

Проект dll
Общие элементы управления dll
Ведение журнала dll
Доступ к базе данных dll

Проект и общие элементы управления ссылкой v2 базы данных DLL. Регистрация однако ссылки v1.

Если в разных компонентах имеются ссылки на разные версии, как VS выбирает, какую из них использовать?
Нужно ли перекомпилировать v1 dll, чтобы использовать самую последнюю базу данных (v2), или мы можем получить ее автоматически?
Можно ли принудительно использовать конкретную версию?

Спасибо

Alex

Ответы [ 4 ]

11 голосов
/ 09 октября 2008

По умолчанию для версионных DLL я полагаю, что VS приведет к точному совпадению. Однако, если вы посмотрите в свойствах ссылки, вы обнаружите свойство под названием «Конкретная версия». Установите значение «false», и оно будет соответствовать более поздним версиям.

К сожалению, у меня нет полной версии VS, чтобы найти подходящую ссылку MSDN.

Кроме того, вы можете использовать элемент assemblyBinding в app.config.

8 голосов
/ 09 октября 2008

Здесь на самом деле есть два сценария - использование строгих имен / GAC или не использование строгих имен.

Если вы используете строгие имена и устанавливаете компоненты в GAC, тогда .Net захочет использовать версию компонента, на которую ссылался клиент, когда он был скомпилирован. Таким образом, в вашем примере было бы вполне возможно, чтобы Project ссылался на базу данных V2, в то время как Logging ссылался на базу данных V1, потому что DLL могут храниться параллельно в GAC. Так что, если вы действительно хотите, чтобы Ведение журнала использовало V2 вместо V1, вам нужно изменить файлы конфигурации, чтобы сказать, что «ссылка на V1 должна указывать на V2». Есть разные места для этого - файл приложения, машинный файл и т. Д.

Если вы не используете строгие имена, то .Net по умолчанию будет использовать версию DLL, которая находится в той же папке, что и клиент. Предположим, вы развернули Project, CommonControls и Logging в той же папке, что и база данных V2. Тогда, даже если ведение журнала было построено для базы данных V1, оно попытается использовать компонент в той же папке, то есть в базе данных V2. Пока V2 может предоставлять те же общедоступные классы и методы, которые Logging хочет использовать, он будет работать нормально.

В моей среде, где все наши приложения являются внутренними, мы не используем GAC. Мы просто разворачиваем все файлы, которые нужны приложению, в одну папку. Если у вас много общих компонентов, то синхронизировать файлы конфигурации будет просто кошмаром.

Это все сильно отличается от COM, где все приложения подобрали текущую зарегистрированную копию DLL (при условии, что V1 и V2 были двоично-совместимыми).

5 голосов
/ 09 октября 2008

Я наткнулся на этот сайт, у которого есть пара предложений: http://blog.fredrikhaglund.se/blog/2008/02/23/get-control-over-your-assembly-dependencies/

Чтобы получить конкретную версию, очевидно, вам нужно отредактировать web.config или app.config?

"Наконец, взгляните на файл csproj с помощью блокнота (или выгрузите проект в Visual Studio, чтобы иметь возможность открывать его как текст). Когда вы добавляете ссылки с помощью Visual Studio, вы получите ссылку на сборку с номером версии. и открытый ключ, и это может создать проблемы при обновлении сборки поставщика до более новой версии. "
http://blog.fredrikhaglund.se/blog/2008/02/23/get-control-over-your-assembly-dependencies/

1 голос
/ 09 октября 2008

Если у вас есть источник, вы можете использовать ссылки на проекты вместо dll-ссылок. Таким образом, вы всегда получите последнюю версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...