Загрузчик Fusion не может найти DLL, которая на самом деле там
-
10-07-2019 - |
Вопрос
Кто-нибудь знает, что может заставить загрузчик Fusion просто пропустить DLL без предупреждения или подтверждения?
Когда я пытаюсь сделать это (в C #) из приложения командной строки
Assembly.LoadFrom("c:\\Deploy\\bin\\WebServices.dll")
Я вижу это:
" Невозможно загрузить один или несколько запрошенных типов. Получите свойство LoaderExceptions для получения дополнительной информации. & Quot;
Эта DLL имеет зависимость от Platform.DLL, но загрузка этой зависимости завершается неудачно, поэтому эта строка кода вызывает исключение. Когда я проверяю сообщение о загрузке сборки Fusion, я вижу следующее:
=== Pre-bind state information === LOG: DisplayName = Platform, Version=9.0.0.0, Culture=neutral, PublicKeyToken=null (Fully-specified) ... LOG: This bind starts in LoadFrom load context. WRN: Native image will not be probed in LoadFrom context. Native image will only be probed in default load context, like with Assembly.Load(). LOG: No application configuration file found. LOG: Using machine configuration file from C:\\Windows\\Microsoft.NET\\Framework64\\v2.0.50727\\config\\machine.config. LOG: Policy not being applied to reference at this time (private, custom, partial, or location-based assembly bind). LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform.DLL. LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform/Platform.DLL. LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform.EXE. LOG: Attempting download of new URL file:///C:/Project/bin/Debug/Platform/Platform.EXE. LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform.DLL. LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform/Platform.DLL. LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform.EXE. LOG: Attempting download of new URL file:///c:/Deploy/bin/Platform/Platform.EXE.
Дело в том, что библиотека присутствует в c: \ Deploy \ bin \ Platform.DLL
с правильной версией и без подписанного открытого ключа.
Вещи, о которых я думал:
1. Может быть, это действительно зависимость Platform.DLL, которая нарушается, вызывая такое поведение? (Я прогнал дерево зависимостей в Reflector, но не нашел отсутствующих DLL)
2. Может быть, есть несоответствие выпуска / отладки или 64-битная или 32-битная версия? но все было построено на одной машине
3. Может быть, я неправильно читаю журналы, но не должен ли он остановиться, когда попадет в найденную DLL? Я не вижу ни одного "успешного" ИЛИ "неудачный" сообщение в этом журнале. Я просто знаю, что это не удалось из-за исключения. Р>
PS больше технических подробностей:
Машинная среда - 64-разрядная Windows 2008 с .NET 2.0, 3.0 и более поздними версиями. 3.5 установлен.
Это же приложение отлично работает на другом компьютере (32-разрядная Vista) с той же структурой каталогов и DLL, хотя они были созданы на этом компьютере
Решение
Да, он должен остановиться, когда найдет требуемую dll, поэтому пятый " Попытка загрузки ... " должен был найти это ...
Однако, откуда запускается приложение командной строки? Если это папка Debug, то вы можете попробовать несколько вещей:
<Ол>Подписать сборку и ссылку через файл .config в следующем формате
<dependentAssembly>
<assemblyIdentity name="WebServices.dll" publicKeyToken="<whatever this public key it>" />
<codeBase version="1.0.0.0" href="..\WebServices.dll" />
</dependentAssembly>
Подпишите их и затем поместите зависимые сборки в GAC.
Я могу быть далеко, но вот несколько вещей, которые можно попробовать.