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?
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.
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.
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.