2009-01-08 11 views
20

हमारे पास एक (शुद्ध देशी सी ++) है। डीएलएल जो वीएस द्वारा निर्मित है। क्लाइंट के रूप में हमारे पास सी ++/सीएलआई में लिखे गए इस डीएलएल के आसपास कुछ देशी सी ++ एप्लिकेशन और नेट-रैपर है। अंत में सी # में लिखे गए नेट-रैपर के लिए कुछ ग्राहक अनुप्रयोग हैं।डीएलएल को स्थिर रूप से कैसे लिंक करें?

मेरी समस्या यह है कि net.dll को नेट दुनिया के काम से अलग तरीके से वितरित किया जाना चाहिए और वीएस उस डीएलएल का ट्रैक नहीं रखता है। तो मेरे सभी सी # ऐप्स सही तरीके से काम करने के लिए मुझे इसे प्रत्येक निष्पादन योग्य निर्देशिका में कॉपी करना होगा या इसे% PATH% में कहीं भी रखना होगा (जिसे मैं डेवलपर कंप्यूटर से बचना चाहूंगा क्योंकि वे डीएलएल के विभिन्न संस्करणों के साथ अलग-अलग ऐप्स शुरू करना चाहते हैं) । यदि बड़ी समस्याएं होती हैं तो उपयोगकर्ता समस्याएं हैं जो रैपर-डीएलएल का संदर्भ देती हैं: आपको डीएलएल को वीएस की निर्देशिका में कॉपी करना होगा या फिर% PATH% पर प्रतिलिपि बनाना होगा। लेकिन हमारे अनुवादक उपकरण के साथ सबसे खराब मामला होता है। यह टूल .Net-Assemblies का ट्रैक रखता है और उन्हें ट्रांसलेटर-पैकेज में पैक करता है जिसे बाहरी अनुवादक को भेजा जा सकता है। जहां तक ​​मुझे पता है कि देशी को डालने का कोई तरीका नहीं है। डीएलएल उस पैकेज में!

इसलिए मैं मूल डीएलएल को मूल रूप से .NET-Wrapper में जोड़ने की योजना बना रहा हूं जो मेरी समस्याओं का समाधान करेगा। लेकिन हमारे मूल अनुप्रयोगों के लिए यह मूल डीएलएल अभी भी एक डीएलएल होना चाहिए।

तो मैं दो विकल्प हैं:

  • की कि दो परियोजनाओं बनाएँ (एक है कि एक स्थिर पुस्तकालय उत्पन्न करता है, और एक है कि एक गतिशील एक बनाता है => मैं इस से बचने की कोशिश)
  • एक समाधान का पता लगाएं DLLs से जोड़ने के लिए स्थिर
  • वी.एस. एक परियोजना
+0

मैं यहाँ एक सा Daft हो सकता है लेकिन मुझे समझ नहीं आता क्यों अपने मूल एप्लिकेशन देशी डीएलएल का उपयोग नहीं कर सकते हैं, और आपके .net ऐप्स C++/cli-wrapped dll का उपयोग करते हैं। – Niklas

+0

वे दोनों कर सकते हैं। लेकिन रैपर-डीएलएल मूल डीएलएल का संदर्भ देता है और इसलिए मेरे सी # ऐप्स दोनों की आवश्यकता है। जो रैपर के लिए ठीक है लेकिन देशी डीएलएल के लिए गधे में दर्द है। – mmmmmmmm

+0

क्यों न सिर्फ डीएल के लिए एक lib बनाएँ? आपने कहा कि आप वीएस का उपयोग कर डीएलएल बनाते हैं, नहीं? –

उत्तर

4

से दो outputs उत्पन्न DLL to Lib की एक प्रति उठाओ जाने के लिए एक रास्ता खोजें (संपादित करें: यदि आप एक सस्ता विकल्प नहीं ढूँढ सकते हैं)

+6

थोड़ा महंगा, है ना? – mmmmmmmm

+1

यह विशेष रूप से महंगा है कि आपके पास पहले से ही डीएलएल का स्रोत है। आप इसे एक स्थिर lib फ़ाइल के रूप में सरल रूप से पुन: संकलित कर सकते हैं। लेकिन नेट इसका उपयोग नहीं करेगा क्योंकि नेट ने lib फ़ाइलों को नहीं किया है। इसका मतलब है कि डीएलएल टू लिब आपकी मदद नहीं करेगा। –

+0

व्हाउआ, जो कि कुछ साल पहले खरीदा गया था, क्योंकि यह 10 के कारक से बढ़ गया है। आउच! –

5

एक और विकल्प दो परियोजनाओं के लिए है, एक परियोजना एक .lib आउटपुट करेगा जो स्थिर रूप से जुड़ा जा सकता है, और एक दूसरी परियोजना जो एक .dll आउटपुट करेगी और आपके .lib निर्भरता के रूप में होगी, आपको .def को जोड़ना चाहिए आपके .dll उन प्रतीकों के साथ जिन्हें आप निर्यात करने की योजना बना रहे हैं, अन्यथा यह खाली होगा।

+0

अच्छा लगता है। मुझे इसे एक मौका और देना होगा। फिलहाल मैंने ओआरजे-फाइल्स को रैपर-डीएलएल (../NativeLib/$(PlatformName)/$(कॉन्फ़िगरेशननाम /).obj) में लिंकर में अतिरिक्त इनपुट के रूप में जोड़कर समस्या हल की। लेकिन यह तरह का कच्चा है और आपके विकल्प बेहतर लगता है! – mmmmmmmm

+0

क्या कोई इस बात में समझा सकता है कि इस संदर्भ में .lib और .dll कैसे भिन्न हो रहे हैं? –

+0

विजुअल स्टूडियो में आपके पास दो differente अनुप्रयोग प्रकार 'स्टेटिक लाइब्रेरी' और 'डीएलएल' हैं। 'स्टेटिक लाइब्रेरी' विकल्प एक '.lib' फ़ाइल बनाता है लेकिन यह सीधे निष्पादन योग्य नहीं है, ऑब्जेक्ट कोड को प्रोसेसिंग के बिना सभी को एक साथ रखा जाता है। 'डीएलएल' विकल्प एक '.dll' बनाएगा जो निष्पादन योग्य है (यानी आप इसे लोडLibrary के माध्यम से उपयोग कर सकते हैं), ऑब्जेक्ट कोड को फ़ंक्शन कॉल को हल करने के लिए संसाधित किया जाता है, अनुकूलित किया जाता है। – Ismael

6

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

+0

लेकिन एक ही परियोजना के दो कॉन्फ़िगरेशन बनाने के लिए कोई रास्ता नहीं है, क्या वहां है? आम तौर पर आप समाधान कॉन्फ़िगरेशन/प्लेटफ़ॉर्म के लिए कॉन्फ़िगरेशन प्रबंधक में एक प्रोजेक्ट कॉन्फ़िगरेशन/प्लेटफ़ॉर्म का चयन कर सकते हैं। – mmmmmmmm

+0

आप प्रोजेक्ट की प्रतिलिपि बना सकते हैं, और उस समाधान में दूसरा कॉन्फ़िगर किया जा सकता है। विभिन्न मध्यवर्ती निर्देशिका सेट करना न भूलें – thewhiteambit

0

आप एक dll पैदा करते हैं और एक lib करने के लिए प्रवेश बिंदु निर्यात dllexport का उपयोग कर सकते हैं, यह यहाँ से समझाया गया है

http://msdn.microsoft.com/en-us/library/3y1sfaz2.aspx