2008-10-22 9 views
15

से प्रबंधित कोड को कॉल करना मैं अप्रबंधित C++ से अपना .NET कोड कॉल करना चाहता हूं। मेरा प्रोसेस एंट्रीपॉइंट .NET आधारित है, इसलिए मुझे सीएलआर होस्ट करने की चिंता करने की ज़रूरत नहीं है। मुझे पता है कि यह .NET ऑब्जेक्ट्स के लिए COM wrappers का उपयोग करके किया जा सकता है, लेकिन मैं प्रबंधित कक्षाओं के अलग-अलग स्थैतिक तरीकों तक पहुंच बनाना चाहता हूं, इसलिए COM मेरा सबसे छोटा/आसान मार्ग नहीं है।अप्रबंधित कोड

धन्यवाद!

+0

[अप्रबंधित कार्यक्रमों के लिए dll कार्यों निर्यात] (के संभावित डुप्लिकेट http://stackoverflow.com/questions/12647766 उत्पन्न होता है उदारीकरण फ़ाइल से लिंक करने के लिए है/exporting-dll-functions-to-unmanaged-programs) – Rohit

उत्तर

6

मान लीजिए कि आप असली अप्रबंधित कोड के बारे में बात कर रहे हैं - न केवल देशी सी ++ मिश्रित-मोड असेंबली में/clr के साथ संकलित है - सी ++/सीएलआई में आपके .NET कोड में एक रैपर बनाने का सबसे आसान तरीका है। फिर आप उन्हें __declspec (dllexport) के साथ चिह्नित करके C++/CLI विधियों को निर्यात कर सकते हैं।

वैकल्पिक रूप से, यदि आपके पास अप्रबंधित कोड के आमंत्रण पर नियंत्रण है, तो आप अपने .NET विधियों के लिए फ़र्श-पॉइंटर्स मार्शल कर सकते हैं और उन्हें अप्रबंधित कोड में भेज सकते हैं।

6

GCHandle कक्षा और gcroot कीवर्ड पर एक नज़र डालें, जो जीसीएचंडल के आसपास एक टाइपएफ़, टेम्पलेटेड रैपर प्रदान करता है।

आप देशी कोड में सीएलआर ऑब्जेक्ट (या बॉक्स किए गए मान) के संदर्भ को रखने के लिए इनका उपयोग कर सकते हैं।

एमएसडीएन का मूल ट्यूटोरियल here है।

+1

ध्यान दें कि इसके लिए सक्षम/clr सक्षम होना आवश्यक है। –

1

आपका कॉलिंग कोड C++ के साथ/clr सक्षम है। सही?

यदि हां, तो आप अपने कोड में अपने .NET dll का उपयोग करने के लिए बस उपयोग कथन का उपयोग कर सकते हैं। कुछ की तरह:

#using <Mydll.dll>

और फिर आप बस अपने प्रबंधित वर्गों की वस्तुओं बना सकते हैं:

MyNameSpace::MyClass^ obj = new MyNameSpace::MyClass();

आप इस अपने वर्ग के एक डेटा सदस्य obj gcroot का उपयोग कर रास्ता है बनाना चाहते हैं जाना।

+0

उपयोगी, लेकिन उन्होंने "अप्रबंधित सी ++ से" कहा था।/clr इसे अप्रबंधित होने से रोकता है। – gbjbaanb

+0

मुझे लगता है कि यही वह विशेष रूप से उल्लेख किया गया है। मेरा प्रोसेस एंट्रीपॉइंट .NET आधारित है, इसलिए मुझे सीएलआर Aamir

+0

होस्ट करने के बारे में चिंता करने की ज़रूरत नहीं है, इसका मतलब यह भी हो सकता है कि वह पी/पूरी तरह से अप्रबंधित सी ++ डीएल में शामिल हो रहा है और फिर सीएलआर में वापस कॉल करना चाहता है । –

3

मुझे विश्वास है कि आप रिवर्स PInvoke की तलाश में हैं। यदि आप रिवर्स पिनवोक के लिए Google हैं तो आपको बहुत उपयोगी प्रविष्टियां मिलेंगी। मुझे लगता है कि निम्नलिखित में एक अच्छा त्वरित और गंदा उदाहरण है। इस समाधान में

PInvoke-Reverse PInvoke and __stdcall - __cdecl

17

देखो: https://sites.google.com/site/robertgiesecke/Home/uploads/unmanagedexports समाधान विशेषता के साथ [dllexport] अपने कार्य को सजाने (पी/आह्वान DllImport के विपरीत) द्वारा सी से सी # समारोह कॉल करने के लिए अनुमति देता है।

उदाहरण के:

सी # कोड

class Test 
{ 
    [DllExport("add", CallingConvention = CallingConvention.StdCall)] 
    public static int Add(int left, int right) 
    { 
     return left + right; 
    } 
} 

सी कोड:

extern "C" int add(int, int); 

int main() 
{ 
     int z = add(5,10); 
     printf("The solution is found!!! Z is %i",z); 
     return 0; 
} 

आउटपुट:

The solution is found!!! Z is 15 

अद्यतन: टिप्पणियों में एक प्रश्न और एक अच्छा जवाब है:

मैं अप्रबंधित परियोजना में डीएल कैसे शामिल करूं?

आप देखेंगे कि आपके सी # कोड संकलन पर (https://msdn.microsoft.com/en-us/library/ba1z7822.aspx?f=255&MSPPError=-2147217396)

+2

मैं अप्रबंधित परियोजना में डीएलएल कैसे शामिल करूं? क्या कहीं एक उदाहरण परियोजना है (उदाहरण के लिए दृश्य स्टूडियो के लिए)? – habakuk

+1

@habakuk मुझे पता है कि यह वर्षों से है लेकिन मैं इसे यहां डाल रहा हूं ताकि कोई और भविष्य में इसे देख सके। जिस तरह से मैंने इसे किया था, x64/x86 का उपयोग कर .cs प्रोजेक्ट को संकलित किया गया था। तब मैंने .lib फ़ाइल से लिंक किया जो मेरे मूल C++ प्रोजेक्ट में जेनरेट किया गया था। हेडर फ़ाइल में मैंने विधि हस्ताक्षर का संदर्भ दिया: बाहरी "सी" { शून्य निर्यात किए गए MethodName(); } फिर इसे सामान्य रूप से उपयोग किया जाता है। – CodingMadeEasy

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