Загрузчик Fusion не может найти DLL, которая на самом деле там

StackOverflow https://stackoverflow.com/questions/1441425

  •  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.

  • Я могу быть далеко, но вот несколько вещей, которые можно попробовать.

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top