Не удалось загрузить файл или сборку 'X' или одну из ее зависимостей. Указанный модуль не может быть найден - PullRequest
4 голосов
/ 06 марта 2012

Снято в темноте, но я подумал, что постараюсь опубликовать в надежде какого-нибудь гения ...

Справочная информация: Я пытаюсь добавить автоматизированное модульное тестирование в огромный неуправляемый проект C ++. По разным причинам в нашей группе мы хотим использовать MSTest. В результате классы и функции из неуправляемого проекта MFC C ++ необходимо вызывать из управляемого проекта C #.

Доказательство осуществимости: Я сделал это в небольшом масштабе, чтобы доказать, что это действительно работает. Вот что я сделал:

  1. Создание неуправляемого проекта MFC C ++ (SOURCE) с несколькими классами и функциями; компилировать как статическую библиотеку (.lib)
  2. Создать управляемый проект C ++ (WRAPPER), который ссылается на вышеупомянутую статическую библиотеку. Каждый класс-оболочка просто создает указатель на объект соответствующего класса в SOURCE и вызывает каждую из его функций, как и ожидалось бы для класса-оболочки. Компилировать как динамическую библиотеку (.dll).
  3. Создать проект C # (C_SHARP). Добавьте ссылку на WRAPPER dll. Теперь вы можете напрямую вызывать функцию WRAPPER (которая, в свою очередь, вызывает неуправляемые функции SOURCE).

Это работает. Я могу поделиться примером проекта, если вы хотите увидеть его. Следующим шагом было принятие концепции и начало работы с нашей гигантской, сильно связанной кодовой базой.

Где я сейчас нахожусь: Короче говоря, у меня есть проект WRAPPER, успешно создающий и создающий DLL. Я добавляю ссылку на мой проект C_SHARP. Я пытаюсь запустить его, но он немедленно останавливается с сообщением:

Необработанное исключение типа 'System.IO.FileNotFoundException' произошло в mscorlib.dll

Дополнительная информация: Coule не загружает файл или сборку 'WRAPPER.dll' или одну из ее зависимостей. Указанный модуль не найден.

Запустил обходчик зависимостей в режиме профиля и получил:


Начало профиля 06.03.2012 в 10:45:11

Операционная система: Microsoft Windows XP Professional (32-разрядная версия), версия 5.01.2600 с пакетом обновления 3 Исполняемый файл программы: c: \ example \ testing \ bin \ debug \ TESTING.EXE

Аргументы программы:

Начальный каталог: C: \ example \ Testing \ bin \ Debug \

Путь поиска: C: \ WINDOWS \ system32; C: \ WINDOWS; C: \ WINDOWS \ System32 \ Wbem

Выбранные параметры: Имитируйте ShellExecute, вставляя любые каталоги путей приложений в переменную среды PATH.

Журнал вызовов DllMain для присоединения процессов и сообщений об отключении процессов.

Подключите процесс для сбора более подробной информации о зависимостях.

Журнал вызовов функций LoadLibrary.

Журнал вызовов функций GetProcAddress.

Записать исключения первого шанса.

Журнал выходных сообщений отладки.

Используйте полные пути при регистрации имен файлов.

Записать отметку времени с каждой строкой журнала.

Автоматически открывать и профилировать дочерние процессы.

00: 00: 00.000: Запущен «c: \ example \ testing \ bin \ debug \ TESTING.EXE» (процесс 0xF4) по адресу 0x00400000. Успешно подключенный модуль.

00: 00: 00.047: загружен файл "c: \ windows \ system32 \ NTDLL.DLL" по адресу 0x7C900000. Успешно подключенный модуль.

00: 00: 00.140: загружен файл "c: \ windows \ system32 \ MSCOREE.DLL" по адресу 0x79000000. Успешно подключен модуль. 00: 00: 00.250: загружен файл "c: \ windows \ system32 \ KERNEL32.DLL" по адресу 0x7C800000. Успешно подключенный модуль.

00: 00: 00.250: вызов DllMain (0x7C900000, DLL_PROCESS_ATTACH, 0x00000000) в «c: \ windows \ system32 \ NTDLL.DLL».

00: 00: 00.250: DllMain (0x7C900000, DLL_PROCESS_ATTACH, 0x00000000) в «c: \ windows \ system32 \ NTDLL.DLL» вернул 1 (0x1).

00: 00: 00.297: вызывается DllMain (0x7C800000, DLL_PROCESS_ATTACH, 0x00000000) в "c: \ windows \ system32 \ KERNEL32.DLL".

00: 00: 00.312: DllMain (0x7C800000, DLL_PROCESS_ATTACH, 0x00000000) в «c: \ windows \ system32 \ KERNEL32.DLL» вернул 1 (0x1).

00: 00: 00.312: вставлено «c: \ Documents and Settings \ Администратор \ Рабочий стол \ зависит22_x86 \ DEPENDS.DLL» по адресу 0x08370000.

00: 00: 00.344: вызов DllMain (0x79000000, DLL_PROCESS_ATTACH, 0x00000000) в «c: \ windows \ system32 \ MSCOREE.DLL».

00: 00: 00.344: DllMain (0x08370000, DLL_PROCESS_ATTACH, 0x00000000) в "c: \ Documents and "\ администратор \ рабочий стол \ зависит от_22_x86 \ DEPENDS.DLL".

00: 00: 00.344: DllMain (0x08370000, DLL_PROCESS_ATTACH, 0x00000000) в "c: \ Documents and настройки \ администратор \ рабочий стол \ зависит от 22_x86 \ DEPENDS.DLL "возвращено 1 (0x1).

00: 00: 00.344: GetProcAddress (0x7C800000 [c: \ windows \ system32 \ KERNEL32.DLL], "FlsAlloc") вызывается из "c: \ windows \ system32 \ MSCOREE.DLL" по адресу 0x79006F3C и возвращен 0xFFBADD11.

00: 00: 00.359: Выход из «c: \ example \ testing \ bin \ debug \ TESTING.EXE» (процесс 0xF4) с кодом -1073740791 (0xC0000409).

Проблема: Что происходит? Почему это работает в моем маленьком примере осуществимости, а не с тем кодом, который я хочу? Я связываю проект WRAPPER с несколькими другими библиотеками, но почему это имеет значение?

...