Вот довольно неприятный рассол, который мы получили на клиентском сайте. Клиент имеет около 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? Возможно, есть какой-то способ исследования ожидаемого интерфейса с использованием отражения, чтобы увидеть, существует ли он, прежде чем называть его?
EDIT: Следует также упомянуть - у нас есть довольно жесткие процедуры QA. Поскольку v1.0.1 был официально выпущен QA, нам не разрешено вносить какие-либо изменения в MyApp или MyDLL. Единственная свобода передвижения, которую мы имеем, - это изменить MyPlugin, который является специальным кодом, написанным специально для этого клиента.
Почему бы не добавить в MyDll метод, ожидаемый старой версией плагина? Внутри этого метода можно вызвать версию нового метода, передающую значение по умолчанию для нового параметра метода. – Steve
@Steve - см. Мое редактирование - не может вносить изменения в MyDLL –
Является ли MyClass.MyMethod статическим? –