Изменение интерфейса между версиями - как управлять?

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

Одна из вещей, которую делает продукт, — это загрузка надстройки (назовите ее «MyPlugIn», которую он сначала ищет на центральном сервере, чтобы узнать, есть ли более новая версия, и если да, то она копирует этот файл локально, затем загружает надстройку с помощью Assembly.Loadи вызывает определенный известный интерфейс. Это работало хорошо в течение нескольких месяцев.

Затем клиент захотел установить v1. 0.1 нашего продукта на некоторых машинах (но не на всех). Это пришло с новой и обновленной версией MyPlugIn.

Но затем возникла проблема. Существует общая DLL, на которую ссылаются MyApp и MyPlugIn, называемая MyDLL, который имеет метод MyClass.MyMethod.Между v1.0.0 и v1.0.1 изменилась подпись MyClass.MyMethod(добавлен параметр).И теперь новая версия MyPlugIn вызывает сбой клиентских приложений версии 1.0.0:

Метод не найден: MyClass.MyMethod(System.String)

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

Есть ли способ написать код в MyPlugin, чтобы он работал одинаково хорошо, независимо от того, работает ли он с MyDLL v1.0.0 или v1.0.1? Возможно, есть какой-то способ проверить ожидаемый интерфейс с помощью отражения, чтобы увидеть, существует ли он, прежде чем вызывать его?

РЕДАКТИРОВАТЬ:Я также должен упомянуть, что у нас есть несколько довольно жестких процедур контроля качества. Поскольку QA официально выпустила версию 1.0.1, нам не разрешено вносить какие-либо изменения в MyApp или MyDLL. Единственная свобода действий, которая у нас есть, — это изменить MyPlugin, который представляет собой пользовательский код, написанный специально для этого клиента.

6
задан Shaul says I Support Monica 1 April 2012 в 12:34
поделиться