Как управлять загруженными версиями dll во время выполнения? - PullRequest
0 голосов
/ 12 мая 2011

Немного фона:

У меня есть проект библиотеки A, который содержит много данных и некоторые управляемые библиотеки DLL. Этот проект имеет свой собственный установщик (из-за его размера) и может быть установлен независимо.

Тогда у меня есть несколько других проектов, которые могут предоставить дополнительные функции, когда обнаружат, что проект А. также установлен.

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

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

Я рассматриваю некоторые возможности:

  1. Отключите interface.dll и загрузите все динамически.
  2. Обнаружение некоторых версий и информирование пользователя об обновлении его версии проекта A.
  3. Использовать некоторые другие средства связи (например, командную строку)

1 Ответ

2 голосов
/ 12 мая 2011

Предположительно интерфейсы, определенные в interfaces.dll и реализованные проектом A, не изменились? Возможно, другие проекты только что добавили новые интерфейсы.

Возможно, здесь возникла старая проблема с версиями .NET DLL. Проект A (A.exe?) Скомпилирован с interfaces.dll версии 1.0.0.0, и эта информация хранится в метаданных A.exe. Когда вы обновляете interfaces.dll до 1.0.0.1, A.exe не может загрузить его. Если новая DLL обратно совместима (что на самом деле должно быть для того, чтобы ваши приведения работали), вы можете предоставить файл политики, который сообщает загрузчику во время выполнения об этой совместимости. Например:

<?xml version ="1.0"?>
<configuration>
<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
        <assemblyIdentity name="interfaces" culture="neutral" publicKeyToken="null"/>
        <bindingRedirect oldVersion="1.0.0.0-1.0.0.1" newVersion="1.0.0.1"/>
    </dependentAssembly>
    </assemblyBinding>
</runtime>
</configuration>

Это говорит загрузчику, что если сборка пытается загрузить любую версию interfaces.dll между 1.0.0.0 и 1.0.0.1, то версия 1.0.0.1 является приемлемой. Назовите этот файл после вашей DLL, используя стандартный шаблон: policy.1.0.interfaces.xml. Затем поместите его в тот же каталог, что и ваш A.exe (я думаю.)

В качестве альтернативы, если вы не изменили номер версии interfaces.dll (что вам действительно нужно), то у вас может быть другая проблема. Если у вас есть две сборки, идентификаторы которых одинаковы, но на самом деле они не совпадают, то, как только загрузчик времени выполнения загрузит одну из них, он никогда не загрузит вторую. Есть еще детали, но, поскольку я считаю, что это вряд ли будет вашей проблемой, я не буду вдаваться в них сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...