में एक सी # कक्षा ऑब्जेक्ट पास करना और मैं एक प्रोटोटाइप कोड एप्लिकेशन पर काम कर रहा हूं जो सी # में चलता है और पुराने सी ++ कोड (आयातित डीएलएल के रूप में) से कक्षाओं और कार्यों का उपयोग करता है। कोड आवश्यकता को क्लास ऑब्जेक्ट में अप्रबंधित सी ++ डीएलएल (सी # से) में पास करना है और इसे C# एप्लिकेशन द्वारा बाद में पुनर्प्राप्ति के लिए संग्रहीत/संशोधित किया जाना है।सी ++ डीएलएल कक्षा
class CClass : public CObject
{
public:
int intTest1
};
सी ++ DLL कार्य::
CClass *Holder = new CClass;
extern "C"
{
// obj always comes in with a 0 value.
__declspec(dllexport) void SetDLLObj(CClass* obj)
{
Holder = obj;
}
// obj should leave with value of Holder (from SetDLLObj).
__declspec(dllexport) void GetDLLObj(__out CClass* &obj)
{
obj = Holder;
}
}
सी # क्लास और आवरण:
[StructureLayout(LayoutKind.Sequential)]
public class CSObject
{
public int intTest2;
}
class LibWrapper
{
[DLLImport("CPPDLL.dll")]
public static extern void SetDLLObj([MarshalAs(UnmanagedType.LPStruct)]
CSObject csObj);
public static extern void GetDLLObj([MarshalAs(UnmanagedType.LPStruct)]
ref CSObject csObj);
}
सी # यहाँ कोड मैं अब तक है ...
सरल सी ++ DLL वर्ग है डीएलएल को फंक्शन कॉल:
class TestCall
{
public static void CallDLL()
{
...
CSObject objIn = new CSObject();
objIn.intTest2 = 1234; // Just so it contains something.
LibWrapper.SetDLLObj(objIn);
CSObject objOut = new CSObject();
LibWrapper.GetDLLObj(ref objOut);
MessageBox.Show(objOut.intTest2.ToString()); // This only outputs "0".
...
}
}
कुछ भी नहीं, लेकिन डीएलएल के भीतर जंक वैल्यू उपलब्ध नहीं हैं (सी # ऑब्जेक्ट में पारित होने से)। मेरा मानना है कि मुझे क्लास मार्शलिंग या मेमोरी/पॉइंटर इश्यू के साथ कुछ याद आ रहा है। मैं क्या खो रहा हूँ?
संपादित करें: मैंने बॉन्ड द्वारा सुझाए गए सी #/सी ++ में विधि/फ़ंक्शन परिभाषाओं में परिवर्तन को दर्शाने के लिए उपर्युक्त कोड बदल दिया। मूल्य (1234) पारित किया जा रहा है अब सी # कोड द्वारा ठीक से पुनर्प्राप्त किया गया है। इसने सी ++ डीएलएल में एक और मुद्दा उजागर किया है। 1234 मान C++ कोड के लिए उपलब्ध नहीं है। इसके बजाय ऑब्जेक्ट में डीएलएल के अंदर 0 का मान है। मैं डीएलएल के भीतर से ऑब्जेक्ट को संपादित करने के लिए पूर्व परिभाषित सी ++ फ़ंक्शंस का उपयोग करना चाहता हूं। किसी और मदद की बहुत सराहना की है। धन्यवाद!
__declspec (dllexport) शून्य SetDLLObj (CClass obj) { धारक = &obj; } स्थानीय CClass के गले में सूचक ताकि आप उस के कबाड़ couse मिल सकता है जाएगा। – user629926
धारक बाद में पुनर्प्राप्ति के लिए C++ कोड में आने वाले मान को संग्रहीत करता प्रतीत होता है। मैं इसे देख सकता हूं, लेकिन मेरी मुख्य चिंता अभी डीएलएल में पारित वस्तु से मूल्य खींच रही है। – notsodev