Исключение 0xC0020001 в сборке C++/CLI

The string binding is invalid. Это то, что происходит, когда я пытаюсь закрыть довольно сложное приложение, которое состоит из C# EXE с использованием C++/CLI DLL, чем, в свою очередь, ссылается на несколько собственных статических библиотек C++ и DLL. (Я использую VS2013 и Boost 1.55.)

Проблема возникает из-за _atexit (по окончании DLL) пытается позвонить _t2m@???__Fep@?1???$get_static_exception_object@Ubad_exception_@exception_detail@boost@@@exception_detail@boost@@YA?AVexception_ptr@1@XZ@YAXXZ@?A0x8b93c95f@@YAXXZ, который является переходом от нативного к управляемому, и CLR, вероятно, к этому моменту уже был отключен.

Мой главный вопрос - почему управляемый блок регистрируется в собственном обработчике завершения, поскольку по определению это не может работать. С этим связан вопрос, почему управляемый блок генерируется для этого типа вообще, поскольку, насколько я могу судить, каждый #include всего, что может ссылаться на этот тип, либо в/clrскомпилированный файл, или в #pragma unmanaged блок в /clr-компилированный файл, поэтому не должно быть никаких управляемых версий. (Помощь для #pragma managed говорит, что именно точка определения определяет, будут ли управляться шаблоны или нет, а не точка создания.)

Возможно, я ошибаюсь по этому поводу, но я всегда предполагал, что когда #includeиспользование заголовочного файла для нативных типов (реализовано в/clr файл) в /clr файл, он должен быть завернут в unmanaged блокировать для предотвращения проблем ODR.

Вопрос (который я помню, читая здесь, но не могу найти ссылку на него) предполагает, что решение состоит в том, чтобы удалить все прагмы и просто дать компилятору понять это. Однако выполнение этого приводит к Managed Debugging Assistant 'LoaderLock' has detected a problem на старте. (Стек вызовов просто указывает на код C#, который приводит к загрузке C++/CLI DLL, что не совсем полезно.)

Этот вопрос говорит о том, что есть ошибка компилятора относительно создания шаблона. При условии get_static_exception_object шаблон, это кажется правдоподобным, но я не уверен, как обойти это.

Хотя другая функция, которая так же зарегистрирована неправильно, _t2m@???__FstrMgr@?1??GetInstance@CAtlStringMgr@ATL@@SAPAUIAtlStringMgr@2@XZ@YAXXZ@@YAXXZ, который не является шаблоном, так что это может быть красная сельдь.

(Я попытался воспроизвести проблему в небольшом примере, но пока не смог этого сделать. Ясно, что есть какой-то триггер, о котором я не знаю.)

0 ответов

Другие вопросы по тегам