Использование версионных сборок .Net - PullRequest
0 голосов
/ 17 ноября 2008

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

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

Итак, у нас есть внешняя сборка ComLib.dll в двух версиях. Можем ли мы сослаться на две версии одной и той же сборки / проекта и как мы можем различить две сборки при определении типов и т. Д.

Предполагая, что вышеупомянутое не может быть сделано из одной сборки / проекта, мы могли бы реализовать сборочные "адаптеры" для каждой версии, по одной для каждой версии внешней сборки (я думаю, у нас уже есть достаточно интерфейсов и абстракций для этого ) но есть ли какие-то предостережения, которые мы должны искать или какие-то конкретные настройки, чтобы избежать путаницы типа / версии во время выполнения (разрешение сборки / загрузка и т. д.)? Достаточно ли «параллельной» поддержки во время выполнения .NET для этой настройки?

ОБНОВЛЕНИЕ: добавлен еще один поворот в этом вопросе, просто чтобы сделать вещи более интересными. Кажется, что внешняя сборка загружает дополнительные сборки и использует внешние файлы конфигурации. Поскольку разные версии нуждаются в разных конфигурационных файлах и разных дополнительных сборках, каждая версия должна каким-то образом загружать дополнительные сборки, соответствующие их версии.

Мне кажется, что мы хотим, чтобы сборки из каждой версии загружались с «корнем» в отдельной папке, содержащей их файл конфигурации и дополнительные сборки. Возможно ли это даже со стандартным распознавателем / загрузчиком сборок, или нам нужно было бы сделать что-то волшебное и, возможно, загрузить сборки вручную (в отдельных доменах приложений?) Для принудительного применения «корневых» папок?

Ответы [ 3 ]

2 голосов
/ 17 ноября 2008

Хороший пост об опциях для этого можно найти здесь: http://kevin -berridge.blogspot.com / 2008/01 / две версии одной и той же общей сборки.

0 голосов
/ 25 апреля 2009

Вы говорите, что этот код используется для связи с внешними станциями. Почему бы не сделать сервис из кода, который связывается с внешними станциями? Эта служба будет вызываться из вашей текущей программы.

Это позволит вам запустить две версии сервиса - одну для старого API и одну для новой. Каждый сервис будет в своем собственном процессе (или, может быть, в AppDomain), поэтому может загружать версии сборок, которые ему нравятся. В процессе переключения основной программы с одной станции на другую вы будете переключаться с одной услуги на другую при изменении версии API.

Это даст дополнительное преимущество, заключающееся в том, что вы изолируете вас от внешнего поставщика, создав третью версию API, которая не будет обратно совместима с первыми двумя.

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

0 голосов
/ 17 ноября 2008

Вы можете подписать сборки самостоятельно, используя ILMerge , а затем использовать эту технику для ссылки на них из того же проекта.

...