У меня есть консольное приложение .NET Framework 4.8 и тестовый проект в той же платформе на C#, которые используют некоторые библиотеки DLL со следующей структурой:
Dll С++ находится в MFC.
Проблема заключается в следующем:
Сценарий A -> Если я запускаю тестовую dll, все dll зависимостей загружаются правильно (я вижу их из модулей в VS) и в основном потоке CCC.dll я могу правильно выполнить метод в DDD.dll, который реализован в EEE.dll.
Сценарий B -> Если я вызываю тот же метод из рабочего потока CWinThread, когда я вызываю тот же метод в DDD.dll, у меня возникают следующие исключения:
Microsoft C++ exception: EEFileLoadException at memory location 0x000000A6FD9FA230
Could not load file or assembly 'DDD.dll, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' or one of its dependencies. The system cannot find the file specified
Также в этом случае, если я проверю загруженные модули в VS, то вижу, что DDD.dll и EEE.dll загружены правильно. Я не понимаю, почему он пытается загрузить DDD.dll еще раз (и почему не находит).
Я пытался использовать AFX_MANAGE_STATE(AfxGetStaticModuleState());
в заголовке своего метода, где я вызываю метод в DDD.dll, но это не решает мою проблему.
Сценарий C -> Если я запускаю сценарии A и B из консольного приложения, все работает нормально, и у меня нет исключений.
Используете ли вы COM во втором потоке? Если да, то инициализируете ли вы COM во втором потоке?
Я нашел проблему. Я понимаю, что рабочий поток C++ может иметь домен приложения, отличный от домена приложения. Поскольку поток С# не имеет этой «функции», я попытался создать рабочий поток на С# через С++/cli. В этом случае AppDomain такой же, как и у приложения, и у меня больше нет ошибок при загрузке библиотеки.
Рады узнать, что ваша проблема решена! Пожалуйста, расценивайте сообщение как ответ. Смотрите Могу ли я ответить на свой вопрос?
Я нашел проблему. Я понимаю, что рабочий поток C++ может иметь домен приложения, отличный от домена приложения. Поскольку поток С# не имеет этой «функции», я попытался создать рабочий поток на С# через С++/cli. В этом случае AppDomain такой же, как и у приложения, и у меня больше нет ошибок при загрузке библиотеки.
call the same method from a worker thread CWinThread
Можете ли вы предоставить минимальный воспроизводимый образец?