2009-09-21 21 views
12

में एक उपग्रह असेंबली को कैसे एम्बेड करें मुझे समस्या मिली है कि मुझे एक सी # प्रोजेक्ट को एक EXE फ़ाइल के रूप में वितरित करने की आवश्यकता है जो इंस्टॉलर नहीं बल्कि असली प्रोग्राम है। इसमें एक अनुवाद भी शामिल करना होगा जो वर्तमान में उपनिर्देशिका में रहता है।EXE फ़ाइल

क्या इसे सीधे बाइनरी में एम्बेड करना संभव है?

उत्तर

10

संक्षिप्त उत्तर हाँ है, Assembly Linker (AL.exe) नामक एक प्रोग्राम है जो इस तरह से असेंबली एम्बेड करेगा। इसका मुख्य उपयोग मामला स्थानीयकरण है, ऐसा लगता है कि आपको इसके लिए भी आवश्यकता है। यदि ऐसा है, तो यह सीधा होना चाहिए।

उदाहरण के लिए:

अल/टी: lib /embed:strings.de.resources/संस्कृति: डी /out:MyApp.resources.dll

या

al.exe/संस्कृति: en-US /out:bin\Debug\en-US\HelloWorld.resources.dll /embed:Resources\MyResources.en-US.resources,HelloWorld.Resources.MyResources.en-US.resources/टेम्पलेट: बिन \ डीबग \ HelloWorld.exe

This उपरोक्त उदाहरणों और अधिक के साथ एमएसडीएन का एक उदाहरण है। इसके अलावा आप this blog post पढ़ना चाहेंगे जो इसके उपयोग को थोड़ा आगे बताता है।

+0

ब्लॉगपोस्ट लिंक टूट गया है । –

+2

जहां तक ​​मैं कह सकता हूं, al.exe का उपयोग सैटेलाइट असेंबली बनाने के लिए किया जा सकता है, लेकिन मुझे नहीं लगता कि यह एक ही असेंबली में कई संस्कृति संसाधनों को विलय कर सकता है, जो सवाल पूछता है। –

3

अन्य विकल्प अन्य असेंबली को एंबेडेड रिसोर्स के रूप में एम्बेड करना है। फिर ऐप डोमेन असेंबली रिसोलव को संभालें, यहां से आप संसाधन से असेंबली पढ़ सकते हैं और इसे रनटाइम में लोड कर सकते हैं। निम्नलिखित की तरह कुछ:

public class HookResolver 
{ 
    Dictionary<string, Assembly> _loaded; 

    public HookResolver() 
    { 
     _loaded = new Dictionary<string, Assembly>(StringComparer.OrdinalIgnoreCase); 
     AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); 
    } 

    System.Reflection.Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     string name = args.Name.Split(',')[0]; 
     Assembly asm; 
     lock (_loaded) 
     { 
      if (!_loaded.TryGetValue(name, out asm)) 
      { 
       using (Stream io = this.GetType().Assembly.GetManifestResourceStream(name)) 
       { 
        byte[] bytes = new BinaryReader(io).ReadBytes((int)io.Length); 
        asm = Assembly.Load(bytes); 
        _loaded.Add(name, asm); 
       } 
      } 
     } 
     return asm; 
    } 
} 
3

ILMerge आपके आवेदन के लिए एक एकल exe फ़ाइल पैदा करेगा। आप माइक्रोसॉफ्ट से download it कर सकते हैं। यह एक साथ असेंबली विलय करता है और उन्हें आंतरिक कर सकता है ताकि विलय वर्ग आंतरिक रूप से सेट हो जाएं। यही वह है जिसे मैंने कई बार फाइल रिलीज बनाने के लिए उपयोग किया है। अपनी निर्माण प्रक्रिया में एकीकृत करना बहुत आसान है।

+6

क्या यह अनुवाद के साथ काम करेगा? – Svish

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