2009-07-10 17 views
7

में प्रोग्रामिक रूप से एम्बेड संसाधनों में मेरे पास एक विशिष्ट संसाधन फ़ाइल एम्बेडेड (जिसे 'Script.xml' नाम दिया गया है) के साथ एक संकलित .NET असेंबली है। मुझे इसे दूसरे के लिए प्रोग्रामिक रूप से बदलने की ज़रूरत है।एक .NET असेंबली

क्या स्रोत से पुन: सम्मिलित किए बिना ऐसा करना संभव है?

वर्तमान में, मैं पाठ में एक खोज करता हूं जो मुझे पता है फ़ाइल में है और यह अच्छी तरह से काम करता है। लेकिन मुझे इसे किसी अन्य प्रोजेक्ट के लिए करने की ज़रूरत है जहां मुझे संसाधन फ़ाइल की कोई भी सामग्री नहीं पता है और मुझे एक और तरीका ढूंढना होगा।

FileStream exe = new FileStream(currentexe, FileMode.Open); 

//find xml part of exefile 
string find = "<?xml version=\"1.0\"?>"; 
string lastchars = new string(' ', find.Length); 
while (exe.CanRead) { 
    lastchars = lastchars.Substring(1) + (char)exe.ReadByte(); 
    if (lastchars == find) { 
     exe.Seek(-find.Length, SeekOrigin.Current); 
     break; 
    } 
} 

//output serialized script 
int bytenum = 0; 
foreach (byte c in xml) { 
    if (c == 0) break; 
    exe.WriteByte(c); 
    bytenum++; 
} 

//clean out extra data 
while (bytenum++ < ScriptFileSize) { 
    exe.WriteByte(0x20); 
} 
exe.Close(); 

उत्तर

4

आप Cecil का उपयोग विधानसभा खोलने के लिए और एक संसाधन (मैं करता हूँ) सम्मिलित करने के लिए कर सकता है। YMMV

+1

यदि आप पीडीबी को सही ढंग से पढ़ने और पुन: उत्पन्न करने के लिए सेसिल का उपयोग करते हैं तो यह पीडीबी को तोड़ नहीं देता है। –

+0

मैं यह मामला होने का अनुमान लगा रहा था, लेकिन 1.5 साल पहले मैं यह नहीं समझ पाया कि इसे कैसे किया जाए। आपके पास कोई उदाहरण है? –

+0

यह पहले से ही काम कर रहा था। लेकिन आजकल नए एपीआई के साथ आप इसे यहां इंगित करना चाहते हैं: https://github.com/jbevain/cecil/wiki/Debug-symbols –

4

आपके मौजूदा तंत्र बहुत नाजुक है - यह हस्ताक्षर किए विधानसभाओं के लिए काम नहीं करेगा (के रूप में हैश बदल जाएगा) या आप एक बड़ा एक के साथ एक संसाधन को बदलने के लिए (के रूप में अन्य सभी ऑफसेट स्थानांतरित कर सकते हैं) की जरूरत है । इसमें चरित्र एन्कोडिंग और सामान्य तंत्र को फाइल में सही बिंदु खोजने के लिए भी समस्याएं हैं, लेकिन वे अपेक्षाकृत महत्वहीन हैं क्योंकि मुझे नहीं लगता कि दृष्टिकोण शुरू करने के लिए उचित है।

आप बदली संसाधनों की जरूरत है, मैं उन्हें एक अलग फाइल में कुल मिलाकर रखा था, जो एक विधानसभा का अपेक्षाकृत नाजुक प्रारूप नहीं है।

+0

संसाधन फ़ाइल बड़ा प्राप्त कर सकते हैं और यह अभी भी काम करता है क्योंकि यह (एक अधिकतम आकार तक: 'ScriptFileSize') रिक्तियों के साथ गद्देदार जा सकता है। और दुर्भाग्यवश इस परियोजना के लिए एक फ़ाइल में निहित होना आवश्यक है। –

+0

@ निक: यह प्रभावी ढंग से कह रहा है कि यह मौजूदा संसाधन से बड़ा नहीं हो सकता है, क्योंकि मौजूदा संसाधन हमेशा ScriptFileSize होगा। मैं वास्तव में, वास्तव में इसे फिर से डिजाइन करने की कोशिश करता हूं। यदि आपको बिल्कुल ऐसा करना है, तो एक लाइब्रेरी का उपयोग करें जो असेंबली फ़ाइल प्रारूप (जैसे सेसिल - http://www.mono-project.com/Cecil) के बारे में जानता है लेकिन यदि संभव हो तो इसे करने से बचने का प्रयास करें। –

+0

@ जोन: सच है, मैं यह उल्लेख करना भूल गया था कि असेंबली मूल रूप से कॉन्स स्क्रिप्टफाइल आकार से मेल खाने के लिए पैडिंग के एक टन के साथ संकलित है। मैं बहुत सारी जगह देता हूं और इसे कभी खत्म नहीं करता हूं और यह वर्तमान में सैकड़ों कंप्यूटरों पर सफलतापूर्वक चल रहा है। लेकिन मैं वास्तव में, वास्तव में इसे फिर से डिजाइन करना चाहता हूं इसलिए मैं यहां पोस्ट कर रहा हूं। –

1

आप शायद सिस्टम की तलाश कर रहे हैं। रनटाइम। गतिशील रूप से एक असेंबली संकलित करने के लिए स्वीकार करें।

1

आप गतिशील प्रतिबिंब, विशेष रूप से AssemblyBuilder वर्ग का उपयोग कर विधानसभाओं बनाने, और आपके गतिशील बनाया विधानसभा में संसाधनों शामिल कर सकते हैं। मुझे यकीन नहीं है कि प्रतिबिंब का उपयोग करके मौजूदा असेंबली को अलग करना संभव है (हालांकि अब मुझे रूचि है)।

यदि संभव हो तो मैं एक और पेड़ उड़ाऊंगा।

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