2009-06-11 11 views
7

मैंने कमांड लाइन (सीएससी) का उपयोग कर एक डीएल बनाया है। मान लीजिए कि डीएलएल में जोड़ें (int, int) विधि है। अब मैं vC++ में उस ऐड फ़ंक्शन का उपयोग करना चाहता हूं ??वीसी ++ में सी # डीएल का उपयोग कैसे करें?

यह कैसे करें?

आपकी सहायता की बहुत सराहना की जाएगी।

मैं यही कर रहा हूं।

vcproj; इस प्रोजेक्ट के लिए मेरे पास राइट क्लिक और लिंकर सेक्शन अतिरिक्त निर्भरताएं जोड़ता है। जिस पथ में डीएल रहता है, उस पथ को जोड़ा गया है।

main.cpp

using namespace Test 

void main() 

{ 

    demo d; 

    d.add(5,5); 

} 

त्रुटि नाम स्थान टेस्ट मौजूद नहीं है।

इसे कैसे हल करें?

मैं अप्रबंधित कोड के रूप में कि dll उपयोग करने की आवश्यकता

उत्तर

9

आपका सी # विधानसभा ComVisible विशेषता (कुछ अन्य बातों के अलावा) की जरूरत है।

[assembly: ComVisible(true)] 

a guide to doing this here है।

+2

यदि सी ++ एप्लिकेशन प्रबंधित किया जाता है, तो यह निश्चित रूप से इससे भी आसान है, और आप COM से पूरी तरह से बच सकते हैं। – Noldorin

+0

@ मैथ्यू ब्रिंडली मैंने http://support.microsoft.com/kb/828736 पर जो किया है, लेकिन मुझे 'const _GUID' से 'const IISWebFrameworkDAAB :: DataAccessInterface' में कनवर्ट नहीं किया जा सकता है, मुझे एक त्रुटि मिल रही है "मुझे क्या करना चाहिए – user1402643

8

MSDN मंचों Calling C# from unmanaged C++ से:

क्या आप होगा क्या करना चाहते हैं केवल वे फ़ाइलें जहां सी # कोड/CLR लोड करने के लिए और फिर बुला सकती C++/CLI का उपयोग कर चाहते संकलन। आपके शेष ऐप मूल रहेगा, जबकि उन सीपीपी फाइलें जिन्हें आप संकलित/clr मिश्रित करेंगे देशी और सीएलआर। आपको पर सी ++/सीएलआई वाक्यविन्यास का उपयोग करके बस अपनी सी # लाइब्रेरी में कॉल करने में सक्षम होना चाहिए।

एक बार जब आप कि फ़ाइल के भीतर एक फ़ाइल के लिए cl.exe कमांड लाइन पर/CLR, फेंक, आप किसी भी कोड जो आप चाहते कामयाब रहे, चाहे यह VB.net में लिखा गया था की परवाह किए बिना कॉल कर सकते हैं, सी # या सी ++/सीएलआई। यह आपके द्वारा किए जाने वाले कार्यों को करने के लिए सबसे आसान तरीका है (अपने मूल C++ ऐप से C# कोड), हालांकि इसकी इसकी चेतावनी और सीमाएं हैं। हालांकि बड़े पैमाने पर "यह बस काम करता है"। इसके अलावा, यह पी/invokes से तेज़ है।

2

यह अत्यधिक निर्भर करता है कि आप किस प्रकार के सी ++ एप्लिकेशन का निर्माण कर रहे हैं। यदि आप सी ++/सीएलआई असेंबली बना रहे हैं तो आपको यह सुनिश्चित करना होगा कि परियोजना में सी # डीएलएल का संदर्भ है। एक बार ऐसा करने के बाद आपको लिखित assping के रूप में कोड टाइप करने में सक्षम होना चाहिए, आपके पास डेमो की परिभाषा है।

namespace Test { 
    public class demo { 
    public void add(int left, int right) { 
     ... 
    } 
    } 
} 

आप एक, सामान्य गैर कामयाब रहे, सी ++ परियोजना का निर्माण कर रहे हैं तो आप विधानसभा तक पहुँचने के लिए इंटरॉप COM उपयोग करना चाहिए। इसमें आपके सी # प्रोजेक्ट में डेमो टाइप को शामिल किया जा सकता है और COM इंटरऑप के लिए इसे पंजीकृत कर रहा है। इसके बाद आप इसे किसी भी अन्य COM घटक की तरह एक्सेस कर सकते हैं।

+0

मैंने इसका पालन किया http://support.microsoft.com/kb/828736 सभी "मूल सी ++ कोड से प्रबंधित डीएलएल को कॉल करें" से पहले अच्छी तरह से चला जाता है, लेकिन जब मैंने पॉइंटर बनाने का प्रयास किया तो मुझे निम्न त्रुटि मिलती है "त्रुटि C2259 : 'IISWebFrameworkDAAB :: DataAccessInterface': निम्नलिखित सदस्यों के कारण अमूर्त वर्ग 1> को तत्काल नहीं कर सकता: 1> 'HRESULT IU अज्ञात :: QueryInterface (const IID और, शून्य **)': सार है "मुझे क्या करना चाहिए? – user1402643

+0

असल में त्रुटि का कारण है "कारण: 'const _GUID' से 'const IISWebFrameworkDAAB :: DataAccessInterface' में कनवर्ट नहीं किया जा सकता है" मुझे क्या करना चाहिए? – user1402643

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