2009-09-01 6 views
8

मैं एक स्वत: जेनरेट सी # प्रोग्राम को एक-ऑफ "स्क्रिप्ट" संकलित करने की कोशिश कर रहा हूं। इस कार्यक्रम में 120,000 विभिन्न स्ट्रिंग अक्षर शामिल हैं। सी # संकलक इस निर्माण नहीं कर सकते, कह रही:सी # संकलन त्रुटि: "अधिक उपयोगकर्ता स्ट्रिंग बनाने के लिए कोई लॉजिकल स्पेस नहीं छोड़ा गया"

Unexpected error writing metadata to file '<removed>' -- 'No logical space left to create more user strings.' 

वहाँ स्ट्रिंग शाब्दिक की संख्या एक एक मॉड्यूल में हो सकता है पर .NET में एक कठिन सीमा है? यह सीमा क्या है? क्या इसके चारों ओर कोई रास्ता है?

+4

मैन, यह चारों ओर एक बुरा विचार की तरह लगता है। –

+3

जैसा कि रेमंड चेन ने एक बार कहा था, "अगर आपको [सीमाओं के बारे में पूछना है], तो आप शायद कुछ गलत कर रहे हैं": http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759। एएसपीएक्स – AakashM

+0

लगता है जैसे आपको पुनर्विचार की आवश्यकता हो सकती है कि आप आर्किटेक्चर हैं ... आपको इतने सारे स्ट्रिंग अक्षर क्यों चाहिए? क्या आप कोड या कुछ में एक शब्दकोश संग्रहीत कर रहे हैं? – peSHIr

उत्तर

11

एक असेंबली में स्ट्रिंग्स की संख्या पर एक सीमा है, जैसे कि कक्षाओं, फ़ील्ड इत्यादि की सीमाएं हैं। इनमें से प्रत्येक को 32-बिट metadata token के साथ पहचाना जाता है, जहां ऊपरी-बाइट बाइट एक मेटा-टाइप-कोड है, और निचले बिट्स व्यक्तिगत डेटा रिकॉर्ड हैं। तारों के लिए, वे वास्तव में स्ट्रिंग ढेर में ऑफसेट की पहचान करते हैं, इसलिए आपके पास तारों के लिए अधिकतम 2 ** 24 बाइट्स हो सकते हैं, यानी 16 एमआईबी। सुनिश्चित नहीं है कि तार यूटीएफ -8 या यूटीएफ -16 में संग्रहीत हैं या नहीं।

+0

संपूर्ण स्रोत फ़ाइल यूटीएफ -8 में 14 एमआईबी है, इसलिए यदि वे यूटीएफ -16 में संग्रहीत हैं तो सीमा पार हो जाएगी। समझ में आता है! –

+0

संसाधन धाराओं से स्ट्रिंग को पुनर्प्राप्त करने के लिए एक वर्कअराउंड हो सकता है। – zproxy

7

मुझे पता नहीं है कि सीमाएं क्या हैं .NET लेकिन, यदि यह संसाधन सीमा है, तो मैं इसे उसी तरह हल कर दूंगा जिस तरह से हमने पुराने पुराने 64 के-सेगमेंट दिनों में अंतरिक्ष से बाहर निकलने का हल किया।

स्ट्रिंग्स को बाहरी करें - उन्हें बाहरी फ़ाइल में रखें और बस ऑफ़सेट स्टोर करें (और लम्बाई अगर वे निरस्त नहीं हैं)। जब आपको स्ट्रिंग की आवश्यकता होती है, तो उसे फ़ाइल से लोड करें और इसका इस्तेमाल करें।

+0

इस पूरी तरह से उचित उत्तर के साथ क्या गलत है? –

+0

परिणाम से निपटने की बजाय, मैं देखता हूं कि संकलक त्रुटि का अर्थ क्या है। ड्रेस द्वारा दिए गए एमएसडीएन पेज और मेरे सुझाव देते हैं कि यह स्ट्रिंग की संख्या पर निश्चित सीमाओं के साथ कुछ भी करने के बजाय डीएलएल संघर्ष या डिस्क स्पेस समस्या हो सकती है। –

+1

हां, लेकिन वाक्यांश में "120,000 विभिन्न स्ट्रिंग अक्षर शामिल हैं" एक नामकरण समस्या के बजाय वास्तविक संसाधन समस्या को इंगित करता है। और मैंने यह सुनिश्चित किया कि मैंने कहा "अगर यह संसाधन सीमा है"। मैं निश्चित रूप से नहीं जानता, सिर्फ इस बारे में सलाह दे रहा हूं कि इसके आसपास कैसे जाना है। मुझे संदेह है कि कम से कम उतना उपयोगी है जितना कि Google में त्रुटि दर्ज करके पहली चीज़ को तोते हुए :-) – paxdiablo

2

मैं अपने आप को पहले इस का सामना किया है कभी नहीं, लेकिन कुछ जानकारी नहीं है और MSDN

पर समाधान का सुझाव दिया हालांकि, जब तक आप हार्ड कोडित स्ट्रिंग शाब्दिक का उपयोग कर के लिए एक अच्छा कारण है, तो आप शायद नहीं बल्कि संसाधन फ़ाइलों का उपयोग पर विचार करना चाहिए अधिकांश तारों के लिए अक्षर से अधिक।

+1

हां, मैंने यह देखा। मुझे शक है कि यह एक टूटी हुई स्थापना है। त्रुटि संदेश स्पष्ट रूप से कहता है कि बहुत सारे तार हैं, और वास्तव में, 120,000 तार तारों का एक बहुत है :) –

+0

पृष्ठ भी डीएल नामों के बीच एक संघर्ष के साथ एक समस्या का सुझाव देता है। (नीचे समुदाय सामग्री की जांच करें) –

संबंधित मुद्दे

 संबंधित मुद्दे