2010-01-18 8 views
6

मैं दो परियोजनाओं के साथ समाधान बनाने के लिए विजुअल स्टूडियो 2008 का उपयोग कर रहा हूं: एक सी # कंसोल ऐप और सी ++ डीएलएल। मैं ऐप को पी/Invoke का उपयोग कर डीएल से एक समारोह कॉल करने के लिए चाहता हूँ। इसलिए मैं सी # ऐप के संदर्भ के रूप में डीएलएल जोड़ने की कोशिश कर रहा हूं। लेकिन जब मैं रेफरेंस कमांड कमांड का प्रयास करता हूं, तो विजुअल स्टूडियो मुझे तब तक नहीं करने देगा जब तक कि मैं डीएलएल (कॉन्फ़िगरेशन प्रॉपर्टीज: जनरल) के तहत/clr प्रॉपर्टी सेट नहीं करता। अब, मैंने सोचा था कि पी/Invoke सादे पुराने Win32 dlls संभाल सकता है। दरअसल, अगर मैं बिना डीएल/क्लियर के अपने डीएलएल का निर्माण करता हूं और इसे हाथ से बिन/डीबग पर कॉपी करता हूं, तो ऐप ठीक चलाता है। तो संदर्भ के रूप में डीएलएल जोड़ने के लिए/clr क्यों आवश्यक है? और यदि वीएस मुझे इसे जोड़ने नहीं देगा, तो क्या कुछ (साफ) कामकाज है ताकि मेरा ऐप डीएल पा सके?एक सी # ऐप से एक डीएलएल के बिना संकलित/सीएलआर में एक संदर्भ जोड़ें?

मुझे लगता है कि किसी के पास एक समान समस्या थी (हालांकि तीसरे पक्ष के डीएल के साथ): Unable to add a DLL Reference to VS 2008 वह जवाब एक रैपर बनाने के लिए था। लेकिन यह वास्तव में जरूरी नहीं है, क्योंकि ऐप सिर्फ डीएलएल का उपयोग कर सकता है; यह सिर्फ संदर्भ संदर्भ जोड़ें जो काम नहीं करता है। और इसके अलावा, क्या रैपर कोड को डीएल के संदर्भ की आवश्यकता नहीं होगी, जैसा कि पहले की तरह ही समस्या को उठा रहा है? मुझे वास्तव में एक ऐसा जवाब पसंद आएगा जिसमें एक रैपर लिखना शामिल न हो।

उत्तर

7

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

+0

मैंने इस कमांड लाइन का उपयोग कर सी # ऐप के लिए प्री-बिल्ड चरण लिखा: "$ (SolutionDir) डीबग \ MathDll.dll" $ (TargetDir) "कॉपी करें। हां, मैं चाहता हूं कि "संदर्भ जोड़ें" कार्यक्षमता काम करे, क्योंकि अब मुझे इसे बनाए रखना है, और मुझे लगता है कि यह रिलीज बिल्ड के लिए अलग होगा .... मैं वास्तव में नहीं देखता कि "संदर्भ जोड़ें" क्यों नहीं होना चाहिए इस तरह की चीज को संभालें। –

+3

मुझे बस ऐसा करने का थोड़ा साफ तरीका मिला। प्री/पोस्ट-बिल्ड डीओएस कमांड का उपयोग करने के बजाय, मैंने सी # प्रोजेक्ट में डीएल को "मौजूदा आइटम" के रूप में जोड़ा। फिर इसके गुणों के तहत, मैंने "आउटपुट निर्देशिका में कॉपी करें" को "नया अगर कॉपी करें" पर सेट किया है। (इसकी "बिल्ड एक्शन" "सामग्री" है।) यह अभी भी मुझे थोड़ा सा हैकिश लगता है, लेकिन कम से कम यह डीबग-बनाम रिलीज इश्यू को ठीक करता है, और यह स्पॉट करने के लिए थोड़ा आसान है। –

+0

ओह - मुझे एहसास हुआ कि मेरा दूसरा कामकाज डीबग-बनाम रिलीज इश्यू को हल नहीं करता है, क्योंकि मैंने डीबग फ़ोल्डर से डीएलएल का संदर्भ दिया है। दूसरी तरफ, पहला वर्कअराउंड "$ (SolutionDir) $ (कॉन्फ़िगरेशन) \ MathDll.dll $" (targetDir) "प्रतिलिपि बनाने के लिए कमांड को बदलकर इस समस्या को संभाल सकता है। –

6

एक C++ DLL पर PInvoke का उपयोग करते समय, संदर्भ जोड़ने के लिए आवश्यक नहीं है। संदर्भ केवल तभी आवश्यक होते हैं जब आप किसी अन्य DLL में प्रबंधित कोड को कॉल कर रहे हों। बस उसी निर्देशिका में सी ++ डीएलएल डालें और DllImport विशेषता

0

सैद्धांतिक रूप से आप सी ++ - डीएलएल को अपने सी #-डीएलएल में एक लिंक किए गए संसाधन के रूप में जोड़ सकते हैं। यह .NET को आपके सी ++ - डीएलएल की प्रतिलिपि बना देगा जहां भी यह सीएसी-डीएलएल को जीएसी में कॉपी करता है। सैद्धांतिक रूप से इसका मतलब है कुछ नुकसान देखते हैं कि:

  • आप लिंक किए गए संसाधन जोड़ने के लिए सी # संकलक (Csc.exe) कमांड लाइन विकल्पों के माध्यम से हिदायत सकता है, लेकिन मैं .csproj फ़ाइल के माध्यम से या यहाँ तक कि यह करने के लिए एक तरह से कभी नहीं मिली विजुअल स्टूडियो
  • यदि सी #-डीएलएल में WinForms उपयोगकर्ता नियंत्रण शामिल हैं और आप इसे डिजाइनर में उपयोग करना चाहते हैं तो यह काम नहीं करेगा क्योंकि Winforms-Designer C# -DLL को एक अस्थायी स्थान पर कॉपी करता है जहां यह इसे लोड करता है लेकिन यह लिंक किए गए संसाधन को अनदेखा करता है ।
  • मुझे नहीं पता कि यह आपके काम करता है अगर आप अपने सी #-डीएलएल को जीएसी में डालते हैं (हाँ सी ++ - डीएलएल संसाधन के रूप में भी जाएगा, लेकिन मुझे नहीं पता कि यह आपके सी # - DLL)

उपरोक्त में से कोई है तो अगर नो-जाने के लिए आप के लिए आप निम्नलिखित Csc.exe कॉल कर सकते हैं:

csc.exe ... /linkresource:cpp.dll 

आशा इस मदद मिल सकती है!

0

निम्न करके एक ऐसी ही समस्या हल हो जाती:

  1. सभी विकास मशीनों पर, पथ पर्यावरण चर करने के लिए सवाल में करने के लिए dll-पथ गयी। इस तरह सभी डेवलपर्स सभी निष्पादन योग्यों के लिए एक पोस्ट बिल्ड स्क्रिप्ट लिखने की आवश्यकता के बिना, सभी निष्पादन योग्यों को डीबग कर सकते हैं जिनके पास अप्रबंधित डीएलएल के साथ असेंबली का संदर्भ है।

  2. उत्पादन के लिए, हर रात को MSBuild कार्य एक ही फ़ोल्डर के लिए सब कुछ बनाता है, और अप्रबंधित dll-s कि के रूप में "सामग्री/हमेशा कॉपी" चिह्नित कर रहे हैं स्वचालित रूप से है कि एक विधानसभा के निर्माण के साथ शामिल हैं कि वे का एक हिस्सा हैं ।

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