Проблемы с бинарной совместимостью системы плагинов C#

Я реализовал систему плагинов в .NET. Базовая библиотека реализует базовые классы и интерфейсы, предоставляемые подключаемым модулям, библиотеки подключаемых модулей связывают базовую библиотеку для использования открытых классов и интерфейсов.

Проблема, с которой я столкнулся, заключается в том, что (простая) перекомпиляция базовой библиотеки (с модификациями или без них) приводит к тому, что плагины не могут быть загружены, выдавая сообщение об исключении:

 "Could not load file or assembly 'BaseLibrary, Version=0.0.1.68, Culture=neutral, PublicKeyToken=7b445b12e635292c' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)"

Эта проблема решается путем компиляции сразу базовой библиотеки и библиотек плагинов, но это не очень удобно во время разработки, так как я довольно часто модифицирую базовую библиотеку на этом этапе.

Есть ли способ «расслабить» бинарное сопоставление?

Возможно ли, что информация о сборке базовой библиотеки (приведенная ниже) может быть причиной проблемы?

 [assembly: AssemblyVersion("0.0.1.*")]

Забыл упомянуть, что сборки подписаны.


Сборки загружаются с использованием следующей процедуры

Assembly hLibrary = Assembly.LoadFile(pPath);
Type plugImageCodecFactoryType = hLibrary.GetType("Derm.ImageCodecPluginFactory", true, false);
object plugImageCodecFactory = Activator.CreateInstance(plugImageCodecFactoryType);
object plugInstance;

MethodInfo plugFactoryCreate = plugImageCodecFactoryType.GetMethod("CreatePlugin", BindingFlags.Instance|BindingFlags.Public);

plugInstance = plugFactoryCreate.Invoke(plugImageCodecFactory, null);

if (plugInstance is IImageCodecPlugin)
    RegisterPlugin((IImageCodecPlugin)plugInstance);

person Luca    schedule 23.08.2011    source источник


Ответы (3)


Прочитайте эти вопросы и ответы для более подробного обсуждения использования AssemblyVersion и AssemblyFileVersion.

Игнорирование номеров сборок при обращении к библиотекам DLL

Различия между AssemblyVersion и AssemblyFileVersion

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

Для незначительных изменений вы можете использовать AssemblyFileVersion, чтобы отметить различия.

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

person MarcE    schedule 23.08.2011

Предполагая, что вы используете Visual Studio, посмотрите ссылки в одном из проектов, который является плагином. Когда вы просматриваете свойства ссылки на вашу базовую библиотеку, на что установлен флаг SpecificVersion? Попробуйте установить его на False и посмотрите, будет ли это иметь значение.

Обратите внимание: если в вашем проекте используется ссылка на проект, а не прямая ссылка на скомпилированную DLL, этот флаг не будет присутствовать. В этом случае вам нужно либо использовать фиксированный номер версии в базовой библиотеке, как вы пробовали, либо вам следует вместо этого переключиться на использование прямой ссылки на DLL, чтобы вы могли изменить свойство SpecificVersion.

person RobV    schedule 23.08.2011
comment
Ссылка на файл не будет видеть компиляции Debug/Release/x86/x64. Но ответ Юозаса Контвайниса на stackoverflow.com/questions/915712/ может решить проблему в этом направлении. - person Luca; 23.08.2011
comment
@Luca Достаточно честно, хотя ОП не спрашивал о разных компиляциях, тем не менее полезная информация - person RobV; 23.08.2011

Для меня здесь нет ничего связанного с плагинами, так как ошибка компилятора говорит о базовой библиотеке, и, учитывая, что вы реализовали базовую архитектуру плагинов, плагины должны быть полностью декомпилированы и загружены лениво. Таким образом, даже если есть проблема с загрузкой плагина, вы встретитесь во время выполнения, а не во время компиляции.

Так что для меня причина в вашей версии сборки.

С Уважением.

person Tigran    schedule 23.08.2011
comment
Да, исправлена ​​версия версии 68 (вместо дефолтной *), плагины загружаются и работают корректно даже в случае перекомпиляции базовой библиотеки. Итак, как мне игнорировать ревизию при загрузке плагина? Я хотел бы пометить бинарные изменения только основными и дополнительными версиями. - person Luca; 23.08.2011
comment
Просто оставьте 0, в чем проблема? - person Tigran; 23.08.2011
comment
Редакция версии идентифицирует исходный/двоичный выпуск. Изменение версии требует перекомпиляции каждого плагина (а также развертывания). - person Luca; 23.08.2011
comment
Хорошо, но опять же, оставьте 0 и увеличьте ту часть версии, которая вам нужна. Я имею в виду, если вы не хотите менять последний номер, не меняйте его, никто и никакая техника не заставит вас это сделать. - person Tigran; 23.08.2011