Динамически загруженные проблемы со сборкой - PullRequest
2 голосов
/ 05 ноября 2011

У меня есть сборка A, эта сборка динамически загружает сборки B, C и E.И это будет загружать больше в будущем.

Проблема первая:
B ссылки F и G, когда я пытаюсь выполнить методы в экземпляретип, объявленный в B, из A, я получаю исключение, сообщающее, что, конечно, F не был найден.
Вопросы:

  1. Как ссылаться на F и G, когда я динамически загружаю сборку B, предполагая, что F и G находятся в той же папке, что и B?
  2. Как я могу ссылаться на F и G, когда я динамически загружаю сборку B, предполагая, что F и G находятся в другой папке?

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

Не удалось загрузить файл или сборку 'log4net, версия = 1.2.10.0, культура = нейтральная, PublicKeyToken = 1b44e1d426115821'или одна из его зависимостей.Определение манифеста обнаруженной сборки не соответствует ссылке на сборку.(Исключение из HRESULT: 0x80131040)

Я предполагаю, что это происходит из-за того, что я использую версию log4net, отличную от одной из зависимостей B.
Вопрос:
Какие меры я могу предпринять, чтобы избежать такого рода проблем с версиями?
Будет ли устранение одной проблемы решить эту проблему?Если нет, то почему?


Должен ли я использовать для этого Autofac?
Это мне поможет?Как?

Имейте в виду, что идея сборки A состоит в том, чтобы использовать «плагины», и в этом порядке декларативно указывать на сборки или их зависимости не вариант

1 Ответ

3 голосов
/ 05 ноября 2011

Пока сборки совместимы с версией, вы можете указать CLR загружать определенную версию независимо от того, с какой версией была скомпилирована сборка, от которой вы зависите.

Например, добавление этого фрагмента в файл конфигурации перенаправит 1.0.0.0-2.0.0.0 сборки System.Web.Mvc для использования 3.0.0.0.

<runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
        <dependentAssembly>
            <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
            <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" />
        </dependentAssembly>
    </assemblyBinding>
</runtime>

Вы можете использовать тот же принцип для любой сборки, например, log4net.

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

Если вы не уверены точно, какая сборка вызывает проблему, существует инструмент под названием Fusion Log Viewer (fuslogvw.exe), который устанавливается вместе с платформой .NET. Его немного странно использовать, но он покажет вам, где именно .NET ищет сборки и какие ошибки возникают во время разрешения сборки.

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