Ссылка на DLL из другой DLL - PullRequest
       5

Ссылка на DLL из другой DLL

11 голосов
/ 23 января 2012

У меня есть прикладная программа на C #, назовем ее App.exe. Он ссылается на библиотеку DLL с именем A.dll, которая, в свою очередь, ссылается на другую библиотеку DLL, а именно B.dll. Однако способ, которым они ссылаются, немного отличается. В коде A.dll он напрямую ссылается на B.dll (перейдя в Проект> Ссылки> Добавить B.dll). Однако в моем App.exe есть код для загрузки A.dll во время выполнения с использованием Assembly.Load () и т. Д.

Подводя итог,

App.exe ---- (загрузка во время выполнения) ---> A.dll ---- (прямая ссылка) ---> B.dll

Все три вещи (App.exe, A.dll и B.dll) находятся в одном каталоге, скажем, в ExeDir. Теперь я хочу поместить A.dll и B.dll в подкаталог ExeDir. Я могу сделать это с помощью файла App.config, в котором указан путь к A.dll, и попросить App.exe загрузить A.dll с этого пути. Пока все хорошо.

Однако проблема в том, что когда я это делаю, .NET выдает мне сообщение о том, что не может найти B.dll, который находится в том же каталоге, что и A.dll. Если я перенесу его обратно в исходный каталог (тот же каталог, что и App.exe), он будет работать нормально. Это означает, что я могу поместить A.dll в подкаталог, но B.dll должен быть в исходном каталоге.

Есть ли способ сохранить обе библиотеки DLL в подкаталоге?

Ответы [ 3 ]

10 голосов
/ 23 января 2012

Добавьте элемент <probing> в ваш app.config:

http://msdn.microsoft.com/en-us/library/823z9h8w.aspx

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <probing privatePath="bin;bin2\subbin;bin3"/>
      </assemblyBinding>
   </runtime>
</configuration>
7 голосов
/ 23 января 2012

Вы можете вручную разрешить сборку B.DLL, предоставив обработчик событий для события AppDomain.AssemblyResolve текущего AppDomain.

currentDomain.AssemblyResolve += ResolveLostAssemblies;

Затем предоставьте реализацию ResolveEventHandler:

private Assembly ResolveLostAssemblies(object sender, ResolveEventArgs args)
{
    // Find the assembly referenced by args.Name, load it dynamically, and return it.
}

Я обнаружил, что это обеспечивает максимальный контроль над тем, какие сборки загружаются и когда. Это особенно хорошо работает в ситуации, когда ваше приложение pluggable и каждый плагин живет в своем собственном подкаталоге папки «plugins» (которая не обязательно является каталогом приложения). Технически сборка даже не должна быть физическим файлом с использованием этого метода. Хотя D метод Стенли обычно считается более стандартным.

1 голос
/ 23 января 2012

Один из вариантов - попытаться зарегистрировать свои сборки в глобальном кэше сборок. http://msdn.microsoft.com/en-us/library/4a9t8a9a.aspx Но это, вероятно, не предпочтительнее, чем ответ Д. Стэнли.

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