System.TypeLoadException in C++/CLI-MFC-Anwendung

Beschreibung

Beim Umstellen einer MFC-Anwendung auf C++/CLI kam nach erfolgreicher Kompilierung beim Start eine .NET-Fehlermeldung System.TypeLoadException, mit Fehlercode 0x80131522.

Ursache

Genau kenne ich die Ursache nicht, verschiedene Berichte/Postings deuten darauf hin, dass es ein Fehler mit dem Assembly Loader ist, der die Anwendung initial startet.

Scheinbar gibt es eine Begrenzung diverser Ressourcen in der Sektion globaler Symbole. Dass dies tatsächlich ein Grund sein könnte zeigte die riesige Dateigröße von 66 MB für die eigentliche Anwendung (früher, ohne C++/CLI war diese 30 MB groß).

Lösung

Die eigentliche, für mich passende, Lösung wurde hier beschrieben:

Ich habe das sogenannte „String Pooling“ in meinen Visual C++-Projekteinstellungen aktiviert. Danach war die kompilierte Anwendung noch 8 MB (statt 66 MB) groß und der Fehler trat beim Laden nicht mehr auf.

Weitere ggf. nützliche Ressourcen:

AllocSysString

Hartnäckigkeit zahlt sich oft aus: Heute habe ich ein Speicherleck (englisch „Memory leak“) in Zeta Producer korrigiert, das seit Version 5 drin war:

Beim Aufruf der Microsoft Scripting Engine habe ich beim Aufruf der Funktion IActiveScriptParse::ParseScriptText irrtümlicherweise CStringT::AllocSysString aufgerufen und den so angeforderten Speicher selbst nicht mehr freigegeben. Dies hätte ich jedoch machen müssen, was ich in der korrigierten Version nun mache.

Das hätte ich aber machen sollen! „RTFM“ hat Mario mir da gleich geantwortet als ich es ihm erzählt habe.

Hiermit also nochmals der ultimative Artikel wann wer für die Freigabe von Zeichenfolgen die mittels AllocSysString reserviert wurden verantwortlich ist: „Allocating and Releasing Memory for a BSTR (Visual C++ Concepts)„.