Нужно загрузить последнюю версию конкретной сборки - PullRequest
0 голосов
/ 10 ноября 2010

У меня есть такая ситуация, когда LoadWithPartialName представляется единственной хорошей альтернативой, хотя она помечена как устаревшая.

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

Допустим, есть исполняемый файл .NET, который я не могу контролировать (из другого подразделения). Давайте назовем это клиентским приложением AppA. Версия AppA - 10.11.12.x.

Приложение AppA имеет прямую ссылку на одну из наших библиотек классов, которая предоставляет некоторую услугу вызывающей стороне (возвращает некоторую информацию). Давайте назовем его SvcB, версия также 10.11.12.x.

Теперь отделу AppA не нужно обновлять свою систему так часто, как мы, поэтому версия AppA останется 10.11.12.x в течение некоторого времени, вероятно, до тех пор, пока мы не решим изменить формат класса, которым мы обмениваемся .

Наше подразделение должно чаще менять логику службы SvcB, и версия должна меняться с каждым крупным развертыванием. Допустим, мы изменили логику и развернули новую версию SvcB, 11.02.11.x. AppA будет по-прежнему ссылаться на старую версию, поэтому используемая логика теперь неверна.

Мы думаем о создании нового «фасада» для нашего сервиса. Давайте назовем это SvcFrontB. Версия SvcFrontB останется прежней, синхронно с собственной версией AppA.

Теперь мне нужен SvcFrontB, чтобы загрузить самую последнюю версию SvcB через отражение. Таким образом, я уверен, что всегда используется новейшая логика.

Как мне добиться этого без использования LoadWithPartialName?

Спасибо Guy

Ответы [ 2 ]

0 голосов
/ 11 ноября 2010

Я узнал как.

Поскольку библиотека DLL SvcFrontB, из которой я буду вызывать SvcB, также будет находиться в GAC, я легко могу найти ее местоположение, поэтому местоположение GAC тоже.

Оттуда я использую Directory.GetFiles, чтобы получить все версии SvcB, которые в настоящее время находятся в GAC, и проанализировать их с помощью Diagnostics.FileVersionInfo.GetVersionInfo, чтобы узнать последнюю версию.

Поскольку я уже знаю имя и PublicKeyToken и теперь у меня есть полная версия, я могу выполнить сборку Assembly.Load.

Пройдя немного дальше, для целей тестирования (только в среде разработки) я также буду искать ключ в App.Config, указывающий мне точный путь к DLL для использования. Сравнивая это с тем, что есть в GAC, я смогу действительно использовать последнюю версию.

Спасибо

0 голосов
/ 11 ноября 2010

Из примеров, которые я скачал, теперь я понимаю, что Fusion.dll - это API, на который вам не нужно ссылаться. Я скачал образец GacTool (MSjogren.Fusion.Native) и вообще не вижу ссылки в проекте.

Однако код там кажется немного сложным. Есть ли простой способ получить список всех версий сборки в GAC?

Например, если бы я мог получить список всех SvcB в GAC, этот список содержал бы две сборки: версию 10.11.12.x и версию 11.02.11.x. Тогда я смогу решить, какой из них является последним, и использовать команду Assembly.Load для его загрузки.

Или, возможно, есть даже более прямой способ получения последней версии сборки с использованием Fusion API?

Любая помощь приветствуется! Спасибо

...