आईएलएमर्ज बेस्ट प्रैक्टिस

क्या आप ILMerge का उपयोग करते हैं? क्या आप डीएलएस की तैनाती को कम करने के लिए कई असेंबली मर्ज करने के लिए आईएलएमर्ज का उपयोग करते हैं? क्या आपको आईएलएमर्जिंग असेंबली के बाद उत्पादन में तैनाती/संस्करण के साथ समस्याएं मिली हैं?

मैं तैनाती घर्षण को कम करने के लिए आईएलएमर्ज का उपयोग करने के संबंध में कुछ सलाह ढूंढ रहा हूं, यदि यह भी संभव है।

0
ro fr bn

12 उत्तर

हमने अभी हमारे समाधानों में आईएलएमर्ज का उपयोग शुरू किया है जिसे पुनर्वितरित किया गया है और हमारी अन्य परियोजनाओं में उपयोग किया जाता है और अब तक इतना अच्छा है। सबकुछ ठीक काम करता प्रतीत होता है। हमने सीधे पैक किए गए असेंबली को भी खराब कर दिया।

हम एमएस एंटरप्राइज़ लाइब्रेरी असेंबली के साथ ऐसा करने पर विचार कर रहे हैं।

एकमात्र असली मुद्दा जो मैं इसके साथ देखता हूं वह पैकेज से व्यक्तिगत असेंबली का संस्करण है।

0
जोड़ा

हम कुछ परियोजनाओं पर आईएलएमर्ज का उपयोग करते हैं। वेब सेवा सॉफ्टवेयर फैक्टरी , उदाहरण के लिए 8 आउटपुट जैसे आउटपुट के रूप में कुछ उत्पादन करता है। हम उन सभी डीएलएल को एक एकल डीएलएल में विलय करते हैं ताकि सेवा होस्ट को केवल एक डीएलएल का संदर्भ देना पड़े।

यह जीवन को कुछ हद तक आसान बनाता है, लेकिन यह एक बड़ा सौदा नहीं है।

0
जोड़ा

परिचय

यह पोस्ट दिखाता है कि सभी .exe + .dll फ़ाइलों को एक संयुक्त .exe के साथ कैसे बदलें। यह डीबगिंग .pdb फ़ाइल को बरकरार रखता है।

कंसोल ऐप्स के लिए

.NET 4.0 का उपयोग करते हुए विजुअल स्टूडियो 2010 एसपी 1 के लिए मूल <कोड> पोस्ट बिल्ड स्ट्रिंग है। मैं इसमें शामिल सभी उप-डीडी फाइलों के साथ एक कंसोल .exe बना रहा हूं।

"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards

मूल संकेत

  • आउटपुट एक फ़ाइल है " AssemblyName.all.exe " जो सभी उप-डीएलएस को एक .exe में जोड़ती है।
  • ILMerge \ निर्देशिका पर ध्यान दें। आपको या तो ILMerge उपयोगिता को अपनी समाधान निर्देशिका में कॉपी करने की आवश्यकता है (ताकि आप ILMerge के इंस्टॉलेशन को दस्तावेज करने के बारे में चिंता किए बिना स्रोत वितरित कर सकें), या इस पथ को इंगित करने के लिए जहां ILMerge.exe रहता है।

उन्नत संकेत

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

नमूना बिल्ड स्क्रिप्ट

यह स्क्रिप्ट सभी .exe + .dll फ़ाइलों को एक संयुक्त .exe के साथ बदल देती है। यह डीबगिंग .pdb फ़ाइल को बरकरार रखता है।

उपयोग करने के लिए, इसे पोस्ट बिल्ड चरण में प्रोजेक्ट बनाएं टैब के अंतर्गत एक सी # प्रोजेक्ट में पेस्ट करें, और सुनिश्चित करें कि आप पहली पंक्ति में पथ को समायोजित करने के लिए < कोड> ILMerge.exe :

rem Create a single .exe that combines the root .exe and all subassemblies.
"$(SolutionDir)ILMerge\ILMerge.exe" /out:"$(TargetDir)$(TargetName).all.exe" "$(TargetDir)$(TargetName).exe" "$(TargetDir)*.dll" /target:exe /targetplatform:v4,C:\Windows\Microsoft.NET\Framework64\v4.0.30319 /wildcards
rem Remove all subassemblies.
del *.dll
rem Remove all .pdb files (except the new, combined pdb we just created).
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).all.pdb.temp"
del *.pdb
ren "$(TargetDir)$(TargetName).all.pdb.temp" "$(TargetName).all.pdb"
rem Delete the original, non-combined .exe.
del "$(TargetDir)$(TargetName).exe"
rem Rename the combined .exe and .pdb to the original project name we started with.
ren "$(TargetDir)$(TargetName).all.pdb" "$(TargetName).pdb"
ren "$(TargetDir)$(TargetName).all.exe" "$(TargetName).exe"
exit 0
0
जोड़ा
@octopusgrabbus विजुअल स्टूडियो में, देखें .. आउटपुट का चयन करें, Build का चयन करें, और यह कंपाइलर (ऊपर दिए गए चरणों सहित) से कमांडलाइन आउटपुट दिखाता है। वैकल्पिक रूप से, इन आदेशों को एक .bat फ़ाइल में कॉपी करें, फिर आउटपुट देखने के लिए इसे एक डॉस विंडो से चलाएं।
जोड़ा लेखक Contango, स्रोत
आप निर्माण से आउटपुट कैसे दिखाते हैं? मुझे आउटपुट लिखने में एक मूक समस्या है। stackoverflow के लिए होना चाहिए .com/प्रश्न/42301103/& hellip;
जोड़ा लेखक octopusgrabbus, स्रोत

मुझे पता है कि यह एक पुराना सवाल है, लेकिन हम न केवल निर्भरता की संख्या को कम करने के लिए आईएलएमर्ज का उपयोग करते हैं बल्कि उपयोगिता द्वारा उपयोग की जाने वाली "आंतरिक" निर्भरताओं (जैसे ऑटोमैपर, रेस्टशर्प, आदि) को आंतरिक बनाने के लिए भी उपयोग करते हैं। इसका मतलब है कि वे पूरी तरह से दूर हो गए हैं, और मर्ज किए गए उपयोगिता का उपयोग करने वाली परियोजना को उनके बारे में जानने की आवश्यकता नहीं है। यह फिर से परियोजना में आवश्यक संदर्भों को कम कर देता है, और यदि आवश्यक हो तो उसे उसी बाहरी पुस्तकालय के अपने संस्करण का उपयोग/अद्यतन करने की अनुमति देता है।

0
जोड़ा

डीएलएल को विलय करते समय हम समस्याओं में भाग गए, जिनके पास समान नामस्थान में संसाधन हैं। विलय प्रक्रिया में संसाधन नामस्थानों में से एक का नाम बदल दिया गया था और इस प्रकार संसाधनों को स्थापित नहीं किया जा सका। हो सकता है कि हम अभी कुछ गलत कर रहे हैं, फिर भी इस मुद्दे की जांच कर रहे हैं।

0
जोड़ा

हम माइक्रोसॉफ्ट एप्लिकेशन ब्लॉक पर आईएलएमर्ज का उपयोग करते हैं - 12 अलग डीएलएल फाइलों के बजाय, हमारे पास एक ही फाइल है जिसे हम अपने क्लाइंट क्षेत्रों में अपलोड कर सकते हैं, साथ ही फाइल सिस्टम स्ट्रक्चर बहुत ही साफ है।

फ़ाइलों को विलय करने के बाद, मुझे विजुअल स्टूडियो प्रोजेक्ट सूची को संपादित करना था, 12 अलग-अलग assmeblies को हटा देना था और एक फ़ाइल को संदर्भ के रूप में जोड़ना था, अन्यथा यह शिकायत करेगा कि यह विशिष्ट असेंबली नहीं ढूंढ सका। मुझे यह भी यकीन नहीं है कि यह पोस्ट परिनियोजन पर कैसे काम करेगा, हालांकि यह कोशिश करने लायक हो सकता है।

0
जोड़ा
अपने अनुभव को साझा करने के लिए +1।
जोड़ा लेखक Peter Mortensen, स्रोत

मैं अपने सभी अलग-अलग अनुप्रयोगों के लिए ILMerge का उपयोग करता हूं। मैंने इसे रिलीज बिल्ड प्रक्रिया में सही रूप से एकीकृत किया है, इसलिए मैं जो भी समाप्त करता हूं वह बिना किसी अतिरिक्त डीएल के एक आवेदन है।

आप देशी कोड वाले किसी भी C ++ असेंबली को ILMerge नहीं कर सकते हैं। आप किसी भी असेंबली को आईएलएमर्ज नहीं कर सकते हैं जिसमें डब्ल्यूपीएफ के लिए एक्सएएमएल शामिल है (कम से कम मुझे इसके साथ कोई सफलता नहीं मिली है)। यह रनटाइम पर शिकायत करता है कि संसाधन स्थित नहीं हो सकते हैं।

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

0
जोड़ा
आपने रिलीज निर्माण एकीकरण कैसे किया?
जोड़ा लेखक Svish, स्रोत
roman.st/Article/ILMerge-and-GeneratedInternalTypeHelper - ILMerge + XAML के लिए एक और वर्कअराउंड
जोड़ा लेखक Prat, स्रोत
ILRepack एक ओपन सोर्स विकल्प है, और (कुछ विस्तार करने के लिए) wpf repacking का समर्थन करता है।
जोड़ा लेखक Gluck, स्रोत
जोड़ा लेखक Sean Gough, स्रोत
आईएलएमर्ज + एक्सएएमएल के लिए यहां एक संभावित कामकाज है: richarddingwall.name/2009/05/14/…
जोड़ा लेखक scobi, स्रोत
@Lamar क्या आप ILMerge के लिए उस wrapper .exe साझा कर सकते हैं?
जोड़ा लेखक florien, स्रोत

मुझे हाल ही में मुद्दा था जहां मैंने असेंबली में असेंबली असेंबली की थी, मेरे पास कुछ कक्षाएं थीं जिन्हें इन्हें उम्ब्राको ओपनसोर्स सीएमएस में प्रतिबिंब के माध्यम से बुलाया जा रहा था।

प्रतिबिंब के माध्यम से कॉल करने की जानकारी डीबी तालिका से ली गई थी जिसमें असेंबली नाम और कक्षा का नामस्थान लागू किया गया था और इंटरफ़ेस था। मुद्दा यह था कि प्रतिबिंब कॉल विफल हो जाएगा जब डीएलएल विलय किया गया था, हालांकि अगर डीएल अलग था तो यह सब ठीक काम करता था। मुझे लगता है कि समस्या एक लम्बे समय के समान हो सकती है?

0
जोड़ा

ऐसा लगता है कि # 1 आईएलएमर्ज बेस्ट प्रैक्टिस आईएलएमर्ज का उपयोग नहीं करता है। इसके बजाय, SmartAssembly का उपयोग करें। इसका एक कारण यह है कि # 2 आईएलएमर्ज बेस्ट प्रैक्टिस हमेशा आईएलएमर्ज करने के बाद पीवीवीरिफ़ को चलाने के लिए है, क्योंकि आईएलएमर्ज गारंटी नहीं देता है कि यह सही निष्पादन योग्य में असेंबली को सही ढंग से मर्ज करेगा।

अन्य ILMerge नुकसान:

  • विलय करते समय, यह एक्सएमएल टिप्पणियों को स्ट्रिप्स करता है (अगर मुझे इसकी परवाह है, तो मैं एक obfuscation टूल का उपयोग करूंगा)
  • यह एक संबंधित .pdb फ़ाइल बनाने में सही ढंग से संभाल नहीं करता

मोनो। सेसिल और मोनो। लिंकर [2] टूल पर ध्यान देने योग्य एक और उपकरण है।

[2]: http://www.mono-project.com/Linker

0
जोड़ा
आईएलएमर्ज का एक बड़ा फायदा Smartassembly से अधिक है, यह है कि यह एक्सएमएल दस्तावेज फाइलों को मर्ज करेगा। Smartassembly पोस्टिंग की तारीख के रूप में ऐसा नहीं करेगा। - एक सशुल्क Smartassembly उपयोगकर्ता
जोड़ा लेखक Cameron, स्रोत
जब आप जिन विधानसभाओं में विलय करना चाहते हैं, उनमें पहले से ही एक .pdb नहीं है। इसके अलावा, SmartAssembly सही रूप से बीएएमएल जैसे डब्ल्यूपीएफ संसाधनों को संभालता है।
जोड़ा लेखक user429921, स्रोत
"यह एक संबंधित .pdb फ़ाइल बनाने में सही ढंग से संभाल नहीं करता है" - यह किस स्थिति के तहत सच है? मैंने ILMerge विलय पीडीबी उत्पन्न किया है, और बिना किसी मुद्दे के उन्हें इस्तेमाल किया है।
जोड़ा लेखक scobi, स्रोत

हमें डब्ल्यूपीएफ निर्भरताओं के संयोजन के साथ एक ही समस्या थी .... आईएलएमर्ज इनसे निपटने के लिए प्रतीत नहीं होता है। Costura.Fody ने हमारे लिए पूरी तरह से काम किया हालांकि और जाने के लिए लगभग 5 मिनट लग गए ... एक बहुत अच्छा अनुभव।

बस Nuget के साथ स्थापित करें (पैकेज प्रबंधक कंसोल में सही डिफ़ॉल्ट परियोजना का चयन)। यह खुद को लक्षित परियोजना में पेश करता है और डिफ़ॉल्ट सेटिंग्स हमारे लिए तुरंत काम करती है।

यह सभी डीएलएल को "कॉपी स्थानीय" = सत्य चिह्नित करता है और एक विलय .EXE (मानक आउटपुट के साथ) उत्पन्न करता है, जो आकार में अच्छी तरह से संपीड़ित होता है (कुल आउटपुट आकार से काफी कम)।

लाइसेंस एमआईटी है ताकि आप आवश्यकतानुसार संशोधित/वितरित कर सकें।

https://github.com/Fody/Costura/

0
जोड़ा

मैं अपने सीआई बिल्ड के हिस्से के रूप में आईएलएमर्ज का उपयोग शुरू कर रहा हूं ताकि एक ही पुस्तकालय में बहुत बारीक दाने वाले डब्ल्यूसीएफ अनुबंधों को गठबंधन किया जा सके। यह बहुत अच्छी तरह से काम करता है, हालांकि नया विलयित lib आसानी से अपने घटक पुस्तकालयों, या उन अन्य libs के साथ सह-अस्तित्व में नहीं हो सकता है जो उन घटक पुस्तकालयों पर निर्भर करते हैं।

यदि, एक नई परियोजना में, आप अपने ILMerged lib और एक विरासत लाइब्रेरी दोनों को संदर्भित करते हैं जो आपके द्वारा आईएलएमर्ज को दिए गए इनपुट में से एक पर निर्भर करता है, तो आप पाएंगे कि आप किसी भी प्रकार से ILMerged lib से किसी भी प्रकार से पास नहीं कर सकते विरासत पुस्तकालय कुछ प्रकार के प्रकार मैपिंग के बिना (उदाहरण के लिए automapper या मैन्युअल मैपिंग)। ऐसा इसलिए है क्योंकि एक बार सब कुछ संकलित हो जाने पर, प्रकार असेंबली नाम के साथ प्रभावी रूप से योग्य होते हैं।

नाम भी टकराएंगे लेकिन आप इसे बाहरी का उपयोग करके ठीक कर सकते हैं उर्फ

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

0
जोड़ा

Note that for windows GUI programs (eg WinForms) you'll want to use the /target:winexe switch.
The /target:exe switch creates a merged console application.

0
जोड़ा