C++/CLI из DLL расширения MFC
У меня есть приложение MFC, которое использует несколько расширений MFC DLL. Я хочу, чтобы это приложение (и несколько других похожих приложений) имели доступ к некоторым частям.net Framework. Я написал библиотеку C# для выполнения нужной работы.net и надеялся, что смогу написать dll MFC, чтобы скрыть весь код C++/CLI от моих приложений. Приложения останутся чистыми приложениями MFC, и единственный код C++/CLI будет в моей новой DLL-библиотеке расширения MFX. Однако, когда я сделал это, приложения потерпели крах при доступе к новой MFC C++/CLI dll. Если я добавлю код C++/CLI в приложения, он будет работать нормально, и я смогу отладить весь путь до C#.
Кто-нибудь понимает, почему идея dll не работает?
Спасибо
3 ответа
Я считаю, что столкнулся с подобной проблемой. Моя установка была похожей - чистое приложение MFC с чистой MFC DLL, которое, в свою очередь, взаимодействовало с C++/CLI DLL. Все будет работать нормально, но при выходе из него произойдет сбой. Проблема усугубилась при тестировании чистой MFC DLL с использованием CppUnit.
При отладке я обнаружил, что из-за ошибки мой код C++ выдавал исключительные ситуации при нарушениях прав доступа (объекты, на которые ссылается свисающий указатель) при выходе. Теперь среда выполнения C++ игнорирует эти нарушения при выходе, а CLR - нет. Среда выполнения CLR создает необработанное исключение, из-за чего создается впечатление, что программа / юнит-тест потерпела крах.
Возможно, ваша проблема в другом, но она звучит очень похоже на ту, что была у меня.
Вы не можете ссылаться на управляемые сборки из чистого нативного кода. Вы должны либо включить переключатель /clr на потребителе (либо в рамках всего проекта, либо в определенных файлах), либо выполнить какое-либо взаимодействие.
Один из вариантов взаимодействия, который позволит вашему потребителю сказать "чистый" - вызов в управляемую сборку через COM Callable Wrapper.
Проект dll MFC ссылается на библиотеку C# и имеет один файл, скомпилированный с /clr, который обрабатывает интерфейс в моей библиотеке C#. Я действительно видел эту работу иногда во время выполнения, но никогда не был в состоянии отладить в dll MFC или в коде C#. Однако, похоже, что он вообще не стабилен и в большинстве случаев дает сбой.