2009-10-02 17 views
5

मैं दो संस्करणों में एक प्रबंधित कोड (ज्यादातर सी ++/सीएलआई) में एक उपकरण बना रहा हूं, एक 'सामान्य उपयोगकर्ता' संस्करण और 'प्रो' संस्करण।स्थिर पुस्तकालयों के .NET समकक्ष?

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

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

तो, संक्षेप में, मैं एक परियोजना में सामान्य कोड बनाने का तरीका नहीं बना सकता और दो एकल डीएलएल असेंबली बनाने के लिए इसे अंतिम उत्पाद परियोजनाओं के साथ जोड़ सकता हूं जिसमें दोनों सामान्य कोड शामिल हैं।

मैं शायद कुछ गलत कर रहा हूं लेकिन मैंने नेटमोड्यूल का उपयोग करके यह कैसे करना है और जो कुछ भी मैं इसे काम नहीं कर सका। अंत में, मैं इसे काम करने का एकमात्र तरीका लिंकर को सामान्य कोड असेंबली के निर्माण उत्पादों को जोड़ने के लिए बताता था जो कि काम करता है, लेकिन यह हैक आईएमएचओ का थोड़ा सा है।

वैसे भी, क्या किसी के पास इस समस्या को हल करने के लिए कोई सुझाव है?

संपादित: मुझे लगता है मैं इस तथ्य है कि उत्पन्न सभाओं नहीं 100% कोड कामयाब वे उसी रूप में प्रबंधित और अप्रबंधित कोड का संयोजन नहीं हो, C++/CLI के साथ उत्पादन विधानसभाओं के साथ काफी आम हैं, शायद उल्लेख किया जाना चाहिए था ...

+0

मैं इस विचार से छुटकारा पाने की अत्यधिक अनुशंसा करता हूं कि आपको इसे एक एकल डीएलएल में पैकेज करने की आवश्यकता है। –

उत्तर

6

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

+0

धन्यवाद, मैं एक नज़र डालेगा। –

+0

मुझे लगता है कि मुझे शायद यह उल्लेख करना चाहिए था कि असेंबली में से एक 100% प्रबंधित कोड नहीं है ... ILMerge इसके साथ काम नहीं करता है :( –

+0

पॉल, मैंने यह जवाब स्वीकार कर लिया है क्योंकि यह स्थितियों के लिए सबसे अच्छा जवाब है असेंबली में कोई अप्रबंधित कोड नहीं है। मैं अभी भी एक समाधान की तलाश कर रहा हूं जो मिश्रित असेंबली के साथ काम करता है। मैंने अभी तक 'मॉड्यूल चीज' की जांच नहीं की है। –

0

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

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

+0

क्या आप अपने दूसरे अनुच्छेद के बारे में कुछ और बता सकते हैं। क्या आप कह रहे हैं कि यदि मेरे पास लिंकर सामान्य कोड असेंबली के निर्माण उत्पादों को अंतिम असेंबली में लिंक करता है तो मुझे इन समस्याओं का सामना करना पड़ेगा? –

+0

हाँ, यही कारण है कि जब आप रीमोटिंग करते हैं, तो आम इंटरफेस सर्वर और क्लाइंट प्रोग्राम्स दोनों द्वारा संदर्भित तीसरी। डीएल फ़ाइल में आयोजित की जाती है। 2 अलग-अलग असेंबली में एक ही नाम और संरचना के साथ एक प्रकार होने से अप्रबंधित सी ++ पुस्तकालयों के विपरीत 2 अलग-अलग प्रकार होते हैं, जिनमें कोई मेटा-डेटा नहीं होता है और इसलिए कार्यक्रम के दोनों संस्करणों में एक ही संरचित प्रकार को देखते हैं। – Blindy

0

Remotesoft Salamander आपको हुक अप करेगा। यह मूल रूप से एक देशी संकलक और लिंकर है।

+0

धन्यवाद, मैं जो चाहता हूं उसके लिए थोड़ा महंगा दिखता हूं लेकिन मैं ले जाऊंगा देखो क्योंकि यह मेरी obfuscation आवश्यकताओं को भी हल कर सकता है ... –

+0

फिर से मिश्रित प्रबंधित/अप्रबंधित असेंबली को संभाल नहीं करता है ... –

2

जैसा कि कहा गया है कि इल्मेज एक तरीका है, व्यक्तिगत रूप से यदि आपका बंडलिंग बहुत सारे डीएल के साथ निकलता है तो मैं Netz का पक्ष लेता हूं।

+0

धन्यवाद निल्स, मैं इसे आज़माउंगा! –

+0

1) ऐसा लगता है कि इसे आउटपुट होने की आवश्यकता है (मेरा आवेदन एक डीएल के रूप में पैक किया गया है)। 2) मिश्रित प्रबंधित/अप्रबंधित सी ++/सीएलआई असेंबली को संभाल नहीं करता है। –

+0

1) हाँ - यह "डीएलएल-केवल" पैकेजिंग को संभाल नहीं सकता है .. 2) क्या आपने "एमकेबंडल" (अन्य उत्तर देखें) पर एक नज़र डाली है - साइगविन एक अजीब शर्त हो सकती है लेकिन आईएमओ एमकेबंडल प्रबंधित हैडल/अप्रबंधित मिश्रण - लेकिन: मैंने इसे वास्तव में कोशिश नहीं की है। (हमेशा चाहता था, कठिन) – Nils

0

मोनो (या साइगविन एक विकल्प है) का उपयोग करते समय mkbundle भी वैध विकल्प हो सकता है।

1

आप modules का उपयोग कर सकते हैं। आप उन्हें असेंबली लिंकर, al.exe का उपयोग करके एक असेंबली में जोड़ सकते हैं।

+0

मैंने कोशिश की और इसे काम नहीं कर सका, क्या आप इसे स्थापित करने के बारे में एक छोटे से उदाहरण के बारे में जानते हैं? आदर्श रूप से कोड को वीएस -2008 के साथ बनाया जा सकता है और कस्टम बिल्ड चरण के साथ विलय मॉड्यूल? –

+0

नहीं, मुझे नहीं पता। मॉड्यूल बहुत गूढ़ हैं। –

1

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

+0

एरिक, यह काम कर सकता है, हालांकि यह एक स्केलेबिलिटी पॉइंट व्यू से दर्द का थोड़ा सा है (यानी एक और प्रोजेक्ट जोड़ने में आसान नहीं है जो प्रोजेक्ट 1 में कोड का 9 0% पर निर्भर करता है)। मैं इसे जाने दूंगा। –

+0

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