J'essaie de compiler un "script" unique, un programme C # autogénéré. Ce programme contient 120 000 littéraux de chaînes différentes. Le compilateur C # ne peut pas construire ceci, en disant: existe une limite difficile sur le nombre de littéraux de chaîne que l'on peut avoir dans un module? Â Quelle est cette limite? Y a-t-il un moyen autour de celui-ci? P> p>
3 Réponses :
Je n'ai aucune idée de ce que les limites sont dans .NET, mais que, s'il s'agit d'une limitation des ressources, je le résoudais de la même manière que nous avons résolue à court d'espace dans les mauvaises jours de segment 64k. P >
externalisez les chaînes - mettez-les dans un fichier externe et stockez simplement les décalages (et les longueurs s'ils ne sont pas terminés nuls). Lorsque vous avez besoin d'une chaîne, chargez-le du fichier et utilisez-le. P>
Plutôt que de s'attaquer au résultat, je vais examiner ce que l'erreur du compilateur signifie en premier. La page MSDN donnée par Dreas et moi-même suggère que cela pourrait être un conflit DLL ou un problème d'espace disque plutôt que de tout faire avec des limites fixes sur le nombre de chaînes.
Oui, mais la phrase "contient 120 000 littéraux de chaînes" semble indiquer un problème de ressources réel plutôt qu'un problème de dénomination. Et je me suis assuré que j'ai déclaré "s'il s'agit d'une limitation des ressources". Je ne sais pas avec certitude, offrant simplement des conseils sur la façon de se déplacer. Je soupçonne que c'est au moins aussi utile que quelqu'un perroquet la première chose qu'ils ont trouvée en entrant l'erreur dans Google :-)
Je n'ai jamais rencontré cela avant moi-même, mais il y a des informations et des solutions suggérées sur MSDN P>
Toutefois, sauf si vous avez une bonne raison d'utiliser des littéraux de chaîne codés dur, vous devez probablement envisager d'utiliser des fichiers de ressources plutôt que des littéraux pour la plupart des chaînes. p>
Oui, j'ai vu ça. Je doute que c'est une installation cassée. Le message d'erreur dit clairement qu'il y a trop de cordes, et en effet, 120 000 chaînes sont beaucoup de cordes :)
La page suggère également un problème avec un conflit entre les noms DLL. (Vérifiez le contenu de la communauté en bas)
Il y a une limite sur le nombre de chaînes dans un assemblage, tout comme il existe des limites sur le nombre de classes, de champs, etc. chacun de ceux-ci est identifié avec un jeton de métadonnées , où l'octet supérieur supérieur est un code méta-type et les bits inférieurs sont l'individu enregistrement de données. Pour les chaînes, ils identifient en fait un décalage dans le tas de cordes. Vous pouvez donc avoir au plus 2 ** 24 octets pour les chaînes, c'est-à-dire 16MIB. Je ne sais pas si les chaînes sont stockées dans UTF-8 ou UTF-16. P>
L'ensemble du fichier source est de 14 MIB dans UTF-8, de sorte que s'ils sont stockés dans UTF-16, la limite sera dépassée. Logique!
Une solution de contournement pourrait être de récupérer la chaîne des flux de ressources.
Homme, cela ressemble à une mauvaise idée tout autour.
Comme Raymond Chen l'a dit une fois, "si vous devez demander [à propos de la limite], vous faites probablement quelque chose de mal": blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx
On dirait que vous pourriez avoir besoin de repenser votre architecture ... Pourquoi auriez-vous besoin de tant de littéraux string? Vous stockez un dictionnaire dans le code ou quelque chose?
Heh, je suis totalement d'accord avec tous vos commentaires. Mais c'était une partie de code «unique» que j'ai déjà exécutée et supprimée pour toujours, donc aucune architecture repenser n'est requise.