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

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

Итак, recup, 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 в подкаталоге?

Ответ 1

Добавьте элемент <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>

Ответ 2

Вы можете вручную разрешить сборку 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.
}

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

Ответ 3

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