C # -Kompilierungsfehler: "Es ist kein logischer Speicher mehr übrig, um weitere Benutzerzeichenfolgen zu erstellen"

8

Ich versuche ein einmaliges "Skript", ein automatisch generiertes C # -Programm, zu kompilieren. Dieses Programm enthält 120.000 verschiedene Zeichenfolgenliterale. Der C # -Compiler kann das nicht erstellen, indem er sagt:

%Vor%

Gibt es in .NET eine feste Grenze für die Anzahl der String-Literale, die man in einem Modul haben kann? Was ist das Limit? Gibt es einen Weg dahin?

    
Roman Starkov 01.09.2009, 13:55
quelle

3 Antworten

11

Die Anzahl der Strings in einer Assembly ist begrenzt, ebenso wie die Anzahl der Klassen, Felder usw. begrenzt ist. Jede dieser Strings wird mit einem 32-Bit Metadaten-Token , wobei das oberste Byte ein Meta-Typ-Code ist und die unteren Bits der einzelne Datensatz sind. Bei Strings identifizieren sie tatsächlich einen Offset in den String-Heap, so dass Sie höchstens 2 ** 24 Byte für Strings, d. H. 16MiB, haben können. Nicht sicher, ob Zeichenfolgen in UTF-8 oder UTF-16 gespeichert sind.

    
Martin v. Löwis 01.09.2009, 14:06
quelle
7

Ich habe keine Ahnung, was die Grenzen in .NET sind, aber wenn es eine Ressourcenbeschränkung ist, würde ich es genauso lösen, wie wir in den schlechten alten 64K-Segmenttagen den Platzmangel behoben haben.

>

Veröffentliche die Strings - lege sie in eine externe Datei und speichere einfach die Offsets (und die Längen, wenn sie nicht null sind). Wenn Sie eine Zeichenfolge benötigen, laden Sie sie aus der Datei und verwenden Sie sie.

    
paxdiablo 01.09.2009 13:59
quelle
2

Ich habe das noch nie selbst erlebt, aber es gibt einige Informationen und Lösungsvorschläge auf MSDN

Wenn Sie jedoch keinen Grund haben, hartcodierte Zeichenfolgenliterale zu verwenden, sollten Sie für die meisten Zeichenfolgen wahrscheinlich eher Ressourcendateien als Literale verwenden.

    
Simon P Stevens 01.09.2009 14:00
quelle

Tags und Links