हां। आप ऐसा कर सकते हैं। दरअसल, न केवल std::string
, std::wstring
, किसी भी मानक सी ++ वर्ग या आपके स्वयं के वर्गों को मार्शल या तत्काल किया जा सकता है और सी #/.NET से बुलाया जा सकता है।
रैपिंग एक std::vector<any_type>
सी में # वास्तव में बस नियमित पी/आह्वान इंटरॉप, यह हालांकि जटिल है साथ संभव है। किसी भी प्रकार का std::map
भी सी #/.NET में किया जा सकता है।
.NET दुनिया से सी ++ ऑब्जेक्ट को तुरंत चालू करने का मूल विचार .NET से C++ ऑब्जेक्ट का सटीक आकार आवंटित करना है, फिर ऑब्जेक्ट को प्रारंभ करने के लिए C++ DLL से निर्यात किए गए कन्स्ट्रक्टर को कॉल करें, फिर आप सक्षम होंगे उस सी ++ ऑब्जेक्ट तक पहुंचने के लिए किसी भी फ़ंक्शन को कॉल करने के लिए, यदि किसी भी विधि में अन्य सी ++ कक्षाएं शामिल हैं, तो आपको उन्हें सी # कक्षा में भी लपेटने की आवश्यकता होगी, आदिम प्रकारों के तरीकों के लिए, आप बस उन्हें पी/इन्हें आमंत्रित कर सकते हैं। यदि आपके पास कॉल करने के लिए केवल कुछ विधियां हैं, तो यह आसान होगा, मैन्युअल कोडिंग में अधिक समय नहीं लगेगा। जब आप C++ ऑब्जेक्ट के साथ होते हैं, तो आप C++ ऑब्जेक्ट की विध्वंसक विधि को कॉल करते हैं, जो एक निर्यात फ़ंक्शन भी है। यदि उसके पास कोई नहीं है, तो आपको बस अपनी स्मृति को .NET से मुक्त करने की आवश्यकता है।
यहाँ एक उदाहरण है।
public class SampleClass : IDisposable
{
[DllImport("YourDll.dll", EntryPoint="ConstructorOfYourClass", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.ThisCall)]
public extern static void SampleClassConstructor(IntPtr thisObject);
[DllImport("YourDll.dll", EntryPoint="DoSomething", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.ThisCall)]
public extern static void DoSomething(IntPtr thisObject);
[DllImport("YourDll.dll", EntryPoint="DoSomethingElse", CharSet=CharSet.Ansi, CallingConvention=CallingConvention.ThisCall)]
public extern static void DoSomething(IntPtr thisObject, int x);
IntPtr ptr;
public SampleClass(int sizeOfYourCppClass)
{
this.ptr = Marshal.AllocHGlobal(sizeOfYourCppClass);
SampleClassConstructor(this.ptr);
}
public void DoSomething()
{
DoSomething(this.ptr);
}
public void DoSomethingElse(int x)
{
DoSomethingElse(this.ptr, x);
}
public void Dispose()
{
Marshal.FreeHGlobal(this.ptr);
}
}
विस्तार के लिए, कृपया नीचे दिए गए लिंक देखते हैं,
C#/.NET PInvoke Interop SDK
बारे में खेद (मैं एसडीके उपकरण के लेखक हूँ)। मैं अपना जवाब बदल दूंगा। कृपया सही उत्तर मत छोड़ो। – xInterop
कोई समस्या नहीं है। मैं उन सभी को बदल दूंगा। धन्यवाद! – xInterop
आपके सभी उत्तरों के अपडेट के लिए धन्यवाद! – Jesse