Mixed-Mode-C ++ / CLI-DLL löst beim Beenden eine Ausnahme aus

8

Ich habe ein Problem mit einer C ++ / CLI Mixed-Mode-DLL, die ich erstellt habe. Beim Entladen wird eine Ausnahme ausgelöst, da die .NET-Anwendung, die sie verwendet, beendet wird. Nachdem DLL_PROCESS_DETACH ausgeführt wurde, führt die DLL eine Laufzeitbereinigung mit automatisch registrierten atexit() / __onexit() -Funktionen durch und löst die folgende Ausnahme aus:

%Vor%

Ich habe das Problem auf einen atexit() -Aufruf zurückgeführt, der von einem statischen Boost-Ausnahmeobjekt get_static_exception_object() registriert wurde.

%Vor%

Ich verwende boost_1_47 zum größten Teil statisch verbunden, außer boost :: thread, das dynamisch verknüpft ist, um loaderlock zu vermeiden. Ich habe auch versucht, alle Boost dynamisch zu verknüpfen, die nicht geholfen haben. Außerdem sind alle Boost-Includes von #pragma unmanaged blocks umgeben.

Ich hoffe, jemand hat ein ähnliches Problem oder kennt eine Lösung?

Danke, Markus

Hier ist der Aufruf-Stack kurz bevor die Ausnahme auftritt:

%Vor%     
Mark 15.11.2011, 23:28
quelle

3 Antworten

8

Ich habe das gleiche Problem gehabt und es geschafft, es auf die folgende Funktion in exception_ptr.hpp zu verfolgen:

%Vor%

Der problematische Teil ist hier: statisch exception_ptr ep (...

Sie können nur statische entfernen und es sollte funktionieren:

%Vor%

Beachten Sie, wie diese Funktion verwendet wird, sie weist die zurückgegebene statische Variable einer anderen statischen Variable zu. Die ganze Implementierung dieser Funktion sieht verdächtig aus, wahrscheinlich werde ich eine Frage bezüglich der Unterstützung dafür aufwerfen.

Es gibt möglicherweise andere Problemumgehungen, um dieses Problem zu beheben. Weitere Analysen zu statischen Variablen in gemischten Baugruppen finden Sie hier: Ссылка jedoch nur in russischer Sprache.

>     
Petro 22.02.2012, 12:26
quelle
0

Wie in einem Post im Boost Mailing beschrieben Liste , ein Ansatz besteht darin, den verwalteten und nicht verwalteten Code in separate Übersetzungseinheiten (.cpp-Dateien und die Header, die sie # enthalten) zu trennen. Boosten Sie nur von den nicht verwalteten Übersetzungseinheiten. Aktivieren Sie nur / clr für die verwalteten Übersetzungseinheiten.

    
Edward Brey 14.01.2013 15:26
quelle
0

Sie können die Zeilen hinzufügen:

%Vor%

vor der get_static_exception_object-Deklaration und nicht nur diese Datei (oder einen Boost-Header, der diese Datei enthält) in Ihre CLI-Dateien einfügen.

Wenn ich ein boost/thread.hpp durch boost/thread/thread.hpp ersetzen wollte, behob ich das Problem.

    
BenjaminB 05.04.2016 09:49
quelle

Tags und Links