Saturday, 15 January 2011

c# - Wrapping "C++ dll" in "C++/CLI" when function returns pointer to abstract class -


मेरे पास c ++ dll है: अप्रबंधित कोड। एच दिखता है:

  #include "stdafx एच "संरचना वर्ग 1 {सार्वजनिक: आभासी शून्य विधि () = 0; }; Extern "C" __declspec (dllimport) वर्ग 1 * Create_function ();  

अप्रबंधित कोडकप की तरह दिखता है:

  #include "stdafx.h" #Include "UnmanagedCode.h" वर्ग Class2: Class1 {सार्वजनिक: शून्य विधि () {}}; कक्षा 1 * बनाएँ_फंक्शन () {क्लास 2 * सी 2 = नया क्लास 2 (); // मुझे इस उदाहरण के लिए मुफ्त स्मृति की परवाह नहीं है Class1 * c1 = (Class1 *) c2; वापसी सी 1; };  

मेरे पास c ++ / cli प्रबंधित वर्ग है:

  #include "library.h" # शामिल "unmanagedCode.h" typedef Class1 * (* Createfunction) (); नामस्थान CLIWrapper {सार्वजनिक रेफरी क्लास ManagedClI {निजी: कक्षा 1 * cl1; सार्वजनिक: ManagedClI () {} शून्य बनाएँ () {// लाइब्रेरी वर्ग स्ट्रिंग ^ पथ = "library.dll को पथ" के साथ सी + + पुस्तकालय को लोड करने के लिए कुछ सामान्य दिनचर्या; // बस सिस्टम :: रनटाइम :: इंटरऑप सर्विसेज :: मार्शल; Const char * cpath = (const char *) (मार्शल :: स्ट्रिंगटीओएचजीलोबेलाएन्सी (पथ))। ToPointer (); लाइब्रेरी लोडर; Loader.load ((स्ट्रिंग) cpath, गलत); मार्शल :: FreeHGlobal (सिस्टम :: IntPtr ((शून्य *) cpath)); Createfunction hDet = (Createfunction) loader.getProcAddress ("Create_function"); Cl1 = hDet (); cl1- & gt; विधि (); // अगर मैं cl1- & gt; विधि () को कॉल करता हूं तो यह सही काम करता है !! } कुछ फंक्शन (शून्य) {cl1- & gt; विधि (); // लेकिन अगर मैं cl1- & gt; विधि () यहां कॉल करता हूं तो यह एक त्रुटि फेंकता है !!! }}; }  

मैं अपने सी # एप्लिकेशन में ManagedCli वर्ग का उपयोग करता हूं, कुछ ऐसा:

  CLIWrapper.ManagedClI वस्तु = नया CLIWrapper.ManagedClI (); object.Create (); object.SomeFunction (); // & lt; - यह त्रुटि के कारण होता है  

object.SomeFunction () त्रुटि का कारण बनता है: संरक्षित मेमोरी पढ़ने या लिखने का प्रयास करता है जब यह कॉल करता है cl1 - & gt; विधि () । लेकिन एक ही समय में cl1- & gt; विधि () सामान्यतः Object.Create () में काम कर रहा है।

मुझे लगता है कि मैं कर रहा हूँ कुछ कोड को लपेटते समय Create_function () क्या कोई सुझाव दे सकता है?

आपका लाइब्रेरी लोडर केवल एक लोडर से ज्यादा है । यह सीएलआई ऑब्जेक्ट है जो DLL को लोड करता है। जब इसका अंतिम संदर्भ दूर हो जाता है और इसे साफ किया जाता है, तो DLL लोड हो जाता है।

आपके सार वर्ग की वर्चुअल फ़ंक्शन तालिका उस DLL में रहती है, जैसा कि ये फ़ंक्शन जो इंगित करता है। जब DLL लोड हो जाता है, तो वर्चुअल फ़ंक्शन तालिका अमान्य हो जाती है, और विधि को कॉल करने का प्रयास अपरिभाषित व्यवहार होने वाला है।

इसे पहले सन्निकटन में ठीक करने के लिए, लाइब्रेरी स्थानीय

के बजाय अपने ManagedClI वर्ग में ऑब्जेक्ट करें।

No comments:

Post a Comment