10 Stimmen

Mixed C++/CLI TypeLoadException Interne Beschränkung: zu viele Felder

Auf der Suche nach einigen neuen UI in Managed/C# Land zu migrieren, habe ich vor kurzem auf Common Language Runtime Support (/clr) auf einem großen Legacy-Projekt, das MFC in einer Shared DLL verwendet und hängt von etwa einem Dutzend anderer Projekte innerhalb unserer Gesamtlösung eingeschaltet. Dieses Projekt ist der Kern unserer Anwendung, und würde alle verwalteten UI-Code, der produziert wird (daher die Notwendigkeit, auf Clr-Unterstützung für Interop zu aktivieren) fahren.

Nachdem ich eine Menge kleiner Fehler und Warnungen behoben hatte, konnte ich die Anwendung endlich kompilieren. Allerdings verursacht das Ausführen der Anwendung eine EETypeLoadException und lässt mich nicht in der Lage zu debuggen...

Nach einigem Suchen habe ich die Ursache gefunden: "System.TypeLoadException: Interne Einschränkung: zu viele Felder", die direkt am Ende der Kompilierung auftritt. Ich fand dann dieser Link die vorschlägt, die Assembly in zwei oder mehr DLLs aufzuteilen. Dies ist jedoch in meinem Fall nicht möglich, da eine Einschränkung darin besteht, dass der Legacy-Code im Grunde unangetastet bleibt.

Kann jemand andere mögliche Lösungen vorschlagen? Ich bin hier wirklich in einer Sackgasse.

16voto

Stellen Sie sicher, dass die String-Pooling einschalten unter C/C++-Codegenerierung aktiviert ist.

Das behebt in der Regel dieses Problem, das zu den "Häh?"-Problemen gehört. MS-Beschränkungen wie die 64k-Beschränkung für Excel-Tabellen. Nur dass diese Einschränkung die Anzahl der Symbole betrifft, die in einer Baugruppe erscheinen können.

3voto

Ich habe dies mit sehr großen Mixed-Mode (C#/C++) Anwendungen dreimal (3x) und einmal setzen die oben genannten fix in Platz haben nie den Fehler wieder gesehen.

Und nein, wenn überhaupt, sollte dies zu einer geringfügig schnelleren Laufzeitausführung führen (nichts, was Sie jemals messen könnten, jedoch).

Aber ich stimme zu, dass es sich um eine Art Notlösung handelt. Die interne Begrenzung der Symbole war früher kein Problem, und wenn doch, dann war sie viel höher. Dann änderte MS einen Teil des Loader-Codes. Ich habe mich auf MSDN darüber aufgeregt und mir wurde unmissverständlich gesagt, dass nur ein Idiot so viele Symbole in eine einzelne Baugruppe packen würde.

(Das ist einer der Gründe, warum ich nicht mehr bei MSDN mitmache.)

Nun, halten Sie mich für dumm, aber ich denke nicht, dass ich die physische Struktur meiner Anwendung ändern und die Dinge in Satelliten-DLLs aufteilen sollte, nur um die Tatsache zu umgehen, dass der Lader entschieden hat, dass 10.001 Symbole 1 zu viel sind.

Und wie Sie schon sagten, haben wir oft keine Kontrolle darüber, wie Assemblies/Satellite DLLs strukturiert sind und welche Art von Abhängigkeiten sie enthalten.

Aber ich glaube nicht, dass Sie diesen Fehler noch einmal sehen werden.

3voto

Brian Ensink Punkte 10994

Müssen Sie /clr für das gesamte Projekt einschalten? Könnten Sie es stattdessen nur für eine kleine, ausgewählte Anzahl von Dateien aktivieren und sehr vorsichtig sein, wie Sie verwalteten Code einbinden? Ich arbeite mit einer großen C++/MFC-Anwendung und wir haben festgestellt, dass es sehr schwierig ist, verwaltetes C++ zu verwenden. Ich liebe C# und .NET, aber managed C++ hat uns nur Kopfschmerzen bereitet. Die meisten unserer Probleme traten mit .NET 1.0/1.1 auf ... vielleicht sind die Dinge jetzt besser.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X