Ссылка на 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.