Загрузчик Fusion не может найти DLL, которая на самом деле там - PullRequest
3 голосов
/ 18 сентября 2009

Кто-нибудь знает, что может заставить загрузчик Fusion просто пропустить DLL без предупреждения или подтверждения?

Когда я пытаюсь сделать это (в C #) из приложения командной строки

Assembly.LoadFrom("c:\\Deploy\\bin\\WebServices.dll")

Я вижу это:

"Невозможно загрузить один или несколько запрошенных типов. Получите свойство LoaderExceptions для получения дополнительной информации."

Эта 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.

Дело в том, что DLL присутствует в 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, хотя они были созданы на этом компьютере

1 Ответ

1 голос
/ 18 сентября 2009

Да, он должен остановиться, когда найдет требуемую DLL, поэтому пятый «Попытка загрузки ...» должен был его найти ...

Однако, откуда запускается приложение командной строки? Если это папка Debug, вы можете попробовать несколько вещей:

  1. Зависимые DLL находятся в той же папке
  2. Подписать сборку и ссылку через файл .config в следующем формате

    <dependentAssembly>
        <assemblyIdentity name="WebServices.dll" publicKeyToken="<whatever this public key it>" />
        <codeBase version="1.0.0.0" href="..\WebServices.dll" />
    </dependentAssembly>
    
  3. Подпишите их и затем поместите зависимые сборки в GAC.

Возможно, я далеко, но вот несколько вещей, которые нужно попробовать.

...