Вот довольно неприятный рассол, с которым мы столкнулись на сайте клиента.Клиент имеет около 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 вызывает сбой клиентских приложений v1.0.0:
Метод не найден: MyClass.MyMethod (System.String)
Клиент явно не хочет развертывать v1.0.1 на всех клиентских станциях, поскольку исправление, включенное в v1.0.1, было необходимо только для нескольких рабочих станций, и нет необходимости развертывать его для всех клиентов.К сожалению, мы (пока) не используем ClickOnce или другие утилиты массового развертывания, поэтому развертывание v1.0.1 будет болезненным и в противном случае ненужным упражнением.
Есть ли какой-то способ написания кода в MyPlugin, чтобыон будет работать одинаково хорошо, независимо от того, имеет ли он дело с MyDLL v1.0.0 или v1.0.1?Возможно, есть какой-то способ поиска ожидаемого интерфейса с использованием отражения, чтобы увидеть, существует ли он, прежде чем его вызвать?
РЕДАКТИРОВАТЬ: Я должен также упомянуть - у нас есть довольно жесткие процедуры обеспечения качества.Поскольку v1.0.1 был официально выпущен QA, мы не можем вносить какие-либо изменения в MyApp или MyDLL.Единственная свобода передвижения, которую мы имеем, - это изменить MyPlugin, который представляет собой пользовательский код, написанный специально для этого клиента.