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

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


person Steve Eisner    schedule 17.09.2009    source источник


Ответы (1)


Да, он должен остановиться, когда найдет необходимую 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.

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

person Michael Prewecki    schedule 17.09.2009
comment
Спасибо за идеи. Я добавил немного больше информации к исходному вопросу - это же приложение работает на другой машине (в другой ОС). Все задействованные EXE / DLL были созданы на разных машинах, но все они имеют одинаковый размер. Я попробую скопировать зависимости локально в каталог bin \ debug, но, в конце концов, он должен иметь возможность запускаться из другого каталога :( Спасибо! - person Steve Eisner; 18.09.2009
comment
Ничего страшного, он может запускаться из другого каталога, но я считаю, что он должен быть подписан, чтобы его можно было добавить в файл конфигурации, как в пункте 2 выше. - person Michael Prewecki; 18.09.2009