2008-09-02 12 views
16

में स्थिर रूप से लिंक करना मैं एक सीएमएस के लिए एक मॉड्यूल पर काम कर रहा हूं। यह मॉड्यूल क्लास लाइब्रेरी डीएलएल के रूप में वितरित किया जाता है।सी #

मेरे पास इस मॉड्यूल में उपयोग करने के लिए कई उपयोगिता पुस्तकालय हैं I क्या वैसे भी मैं इन पुस्तकालयों को स्थैतिक रूप से लिंक कर सकता हूं इसलिए मुझे कई डीएलएल वितरित करने की ज़रूरत नहीं है (जिससे मेरी उपयोगिता पुस्तकालयों को अलग से वितरित किया जा सकता है)?

मुझे केवल एक डीएलएल होना चाहिए।

उत्तर

23

आप ILMERGE के साथ अपने कई DLLs विलय कर सकते हैं:

http://research.microsoft.com/~mbarnett/ILMerge.aspx

इसे अपने आप को आज़माया नहीं। आशा करता हूँ की ये काम करेगा।


यहाँ डाउनलोड करें:
http://www.microsoft.com/downloads/details.aspx?familyid=22914587-B4AD-4EAE-87CF-B14AE6A939B0&displaylang=en

संक्षिप्त विवरण(से डाउनलोड-पेज)
ILMerge एक भी नेट विधानसभा में कई .NET विधानसभाओं मर्ज करने के लिए एक उपयोगिता है। यह निष्पादन योग्य और डीएलएल पर समान रूप से काम करता है और आउटपुट के प्रसंस्करण और प्रारूप को नियंत्रित करने के लिए कई विकल्पों के साथ आता है। विवरण के लिए साथ में प्रलेखन देखें।

+1

जैसा कि सेब ने उल्लेख किया है कि ILMERGE यह करेगा - लेकिन एक चेतावनी यह है कि असेंबली में से कोई भी असुरक्षित कोड नहीं रख सकता है। –

+5

असुरक्षित कोड ठीक है। यह मिश्रित मोड असेंबली से निपटने नहीं करेगा। जिस तरह से अप्रबंधित कोड होता है और सी ++/सीएलआई प्रोजेक्ट द्वारा बनाया गया था। –

2

इसके लिए संक्षिप्त उत्तर नहीं है! संकलन के दौरान आप एक डीएल में लिंक नहीं कर सकते हैं। मुझे नहीं पता कि ऐसा करने के लिए कुछ सूक्ष्म तरीका है, लेकिन आपको शायद अपने सीएमएस के साथ डीएलएस वितरित करना होगा। ऐसा करने का सबसे अच्छा तरीका किसी प्रकार का पुनः वितरित करना है।

+0

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

+2

@ Kobor42: गलत, यह लिंक नहीं कर रहा है यह विलय कर रहा है। जबकि सबसे ऊंचा उत्तर प्रश्न के इरादे का जवाब देता है (और इस प्रकार सबसे उपयोगी उत्तर है), खेबेबी का जवाब वास्तव में सही है, जब तक कि कोई व्यक्ति पूछे जाने वाले प्रश्न का सही उत्तर दे। आप सी/सी ++ में एक डीएल को भी लिंक नहीं कर सकते हैं, आपको ऐसा करने के लिए एक स्थिर संग्रह की आवश्यकता है ... –

+0

यह उल्लसित है कि यह उत्तर तकनीकी रूप से सही है, कोई अपवर्त नहीं है। सी # एक प्रबंधित भाषा है, और यहां तक ​​कि आईएलएमर्ज एक असेंबली-विलय है जो एक लिंकर नहीं है। एक लिंकर, जैसा कि सी ++ और सी डेवलपर्स द्वारा समझा जाता है, वर्तमान में .NET में मौजूद नहीं है क्योंकि यह वर्तमान में मौजूद है। हालांकि 2015 के मध्य में अभी तक जारी नहीं होने वाली "नेट मूल" तकनीक, कुछ दिन जारी की जा सकती है जो पूरी तरह से संकलित (अब कोई एमएसआईएल नहीं) आवेदन की अनुमति देता है, जिसे तब स्थिर रूप से जोड़ा जा सकता है। –

12

आप ILMerge का उपयोग नहीं करना चाहते हैं, तो इस पृष्ठ को देखें:

http://blogs.msdn.com/b/microsoft_press/archive/2010/02/03/jeffrey-richter-excerpt-2-from-clr-via-c-third-edition.aspx

संपादक के नोट: जेफरी रिक्टर सलाह संसाधनों के रूप में exe फ़ाइल (में अपने DLLs डाल करने के लिए प्रत्येक DLL फ़ाइल के लिए आप जोड़ते हैं, इसकी गुण प्रदर्शित करते हैं और "एंबेडेड रिसोर्स" में "एक्शन बिल्ड" को बदलते हैं।)। फिर निष्पादन योग्य काम करने के लिए एक कस्टम क्लास लोडर की आवश्यकता होती है (रनटाइम पर, सीएलआर निर्भर डीएलएल असेंबली नहीं ढूंढ पाएगा, जो एक समस्या है। इसे ठीक करने के लिए, जब आपका एप्लिकेशन प्रारंभ होता है, तो कॉलबैक विधि पंजीकृत करें AppDomain's ResolveAssembly घटना)।

अपने वास्तविक संसाधनों को इंगित करने के लिए resourceName स्ट्रिंग को परिवर्तित करना सुनिश्चित करें। (उदाहरण के लिए AssemblyLoadingAndReflection को अपने प्रोजेक्ट नाम में बदलें।)

+1

इतना बेहतर! तीसरे पक्ष के उपकरण पर Nativ समाधान। ILMerge निर्माता की टिप्पणी के लिए टिप्पणी अनुभाग देखें ... – Kobor42

+2

हालांकि यह थोड़ा अतिरिक्त प्रयास करता है, यह स्वीकार्य उत्तर पर बेहतर समाधान की तरह लगता है। – CubicleSoft

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

  • कोई संबंधित समस्या नहीं^_^