Исключение 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
, который не является шаблоном, так что это может быть красная сельдь.
(Я попытался воспроизвести проблему в небольшом примере, но пока не смог этого сделать. Ясно, что есть какой-то триггер, о котором я не знаю.)