हां का उपयोग करने का प्रयास करें। आप ऐसा कर सकते हैं। दरअसल, न केवल std::string
, std::wstring
, किसी भी मानक सी ++ वर्ग या आपके स्वयं के वर्गों को मार्शल या तत्काल किया जा सकता है और सी #/.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
(मैं एसडीके उपकरण के लेखक हूँ)
बार जब आप अपने सी के लिए सी # आवरण वर्ग है ++ कक्षा तैयार है, ICustomMarshaler
को कार्यान्वित करना आसान है ताकि आप .NET से C++ ऑब्जेक्ट को मार्शल कर सकें।
http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.icustommarshaler.aspx
महान प्रश्न; मुझे आश्चर्य हुआ कि यह स्वचालित रूप से काम नहीं करता है। http://msdn.microsoft.com/en-us/library/1b4az623.aspx –
मैं भी आश्चर्यचकित था ... इसका कोई बड़ा कारण नहीं है ... लेकिन ऐसा लगता है कि एसटीएल इसके साथ काम नहीं करेगा ... इसके अलावा ... मैं केवल WCHAR का उपयोग करने के लिए फ़ंक्शन को बदल दूंगा, लेकिन यह एक डीएलएल नहीं है जिसे मैं बदल सकता हूं। –