Вот довольно неприятная загвоздка, в которую мы попали на клиентском сайте. У клиента около 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, который представляет собой пользовательский код, написанный специально для этого клиента.