Ссылка на сборку не найдена, хотя сборка находится в том же каталоге

В настоящее время мы разрабатываем надстройку для некоторого программного обеспечения. Решили разрабатывать в .NET, хоть приложение и написано на каком-то родном языке. Так как при непосредственном создании внешнего интерфейса в .NET возникли некоторые проблемы, мы решили создать мостовую DLL на C++/CLI, которая выполняет некоторую базовую инициализацию, а затем загружает нашу управляемую сборку и создает из нее пользовательский элемент управления.

В файле .ini надстройки DLL C++/CLI указывается по имени, поэтому приложение загружает ее оттуда. Однако на .NET DLL просто ссылаются из C++/CLI DLL (как на управляемую ссылку), поэтому доступны экспортированные типы. Однако в этой настройке приложение аварийно завершает работу при загрузке .NET DLL.

Мы быстро обнаружили, что можем просто подписаться на событие AppDomain.AssemblyResolve, чтобы загрузить сборку .NET из того же каталога, где находится C++/CLI DLL, так что сама проблема решена.

Фактический вопрос: почему загрузчик не находит .NET DLL, даже если она находится в том же каталоге, что и сборка, ссылающаяся на нее? Я всегда ожидал, что загружаемые сборки сначала будут искать в одном и том же каталоге, а не только в текущем рабочем каталоге. Почему исполняемый файл находит сборку, если он меняет свой рабочий каталог? Или все по-другому, если CLR вызывается путем загрузки сборки C++/CLI (а не чистого управляемого приложения)?


person OregonGhost    schedule 21.09.2010    source источник


Ответы (2)


Я бы рекомендовал вам использовать fuslogvw.exe для анализа проблем такого рода:

Fuslogvw.exe и диагностика привязки сборки .NET проблемы

И, конечно же, универсального инструмента для анализа проблем с файлами не найдено:

Монитор процессов

person Dirk Vollmar    schedule 21.09.2010
comment
Спасибо, я посмотрю Fuslogvw.exe. Я знаю о Process Monitor и Process Explorer для изучения этих проблем, но оба не говорят мне, почему они не работают так, как я ожидал. - person OregonGhost; 21.09.2010

Путь проверки сборок становится немного непредсказуемым, когда неуправляемый EXE-файл запускает процесс. Тот факт, что загружается C++/CLI DLL, возможно, через LoadLibrary или SetDllDirectory, не никоим образом не влияет на путь проверки для CLR.

Но это только предположение. Нет необходимости гадать, когда вы смотрите на вывод, созданный Fuslogvw.exe. Он показывает вам, что именно проверяется и какие политики применяются. Вы решаете проблему с помощью файла app.exe.config (элемент проверки) или даже с помощью AssemblyResolve.

person Hans Passant    schedule 21.09.2010
comment
Как я уже сказал в другом комментарии, я посмотрю на Fuslogvw.exe. Возможно, app.exe.config — лучшее решение, хотя в целом я согласен с AssemblyResolve. - person OregonGhost; 21.09.2010
comment
Ну, просто имейте в виду, что ваш клиент может изменить файл .config, но не ваш обработчик событий. - person Hans Passant; 21.09.2010
comment
Это точка для обработчика событий. Обратите внимание, что в этом случае заказчик получит полный исходный код, а конечные пользователи ожидают установочный пакет Just Works[TM]. - person OregonGhost; 28.09.2010
comment
Вы утверждаете, что необходимость копаться в тысячах строк кода лучше, чем файл конфигурации? - person Hans Passant; 28.09.2010