2008-10-01 15 views
7

मैं के रूप में परिभाषित एक देशी DLL में एक समारोह है इस प्रकार है:मार्शल सी ++ "स्ट्रिंग" सी # पी में वर्ग/आह्वान

#include <string> 
void SetPath(string path); 

मैं माइक्रोसॉफ्ट के पी/आह्वान इंटरॉप सहायक में इस डालने की कोशिश की है, लेकिन यह पर chokes "स्ट्रिंग" कक्षा (जो मुझे लगता है कि एमएफसी से है?)।

मैंने इसे विभिन्न प्रकारों (सी # स्ट्रिंग, चार [], बाइट []) के रूप में मार्शल करने का प्रयास किया है, लेकिन हर बार जब मुझे या तो असमर्थित अपवाद या मूल असेंबली अपवाद मिलता है (मैंने किस मार्शलिंग की कोशिश की है)।

किसी ने कभी भी देशी/प्रबंधित इंटरऑप किया है जहां देशी स्ट्रिंग क्लास का उपयोग किया जाता है? क्या मार्शल के लिए कोई रास्ता है? क्या मुझे अपना मार्शलर लिखना होगा?

+0

महान प्रश्न; मुझे आश्चर्य हुआ कि यह स्वचालित रूप से काम नहीं करता है। http://msdn.microsoft.com/en-us/library/1b4az623.aspx –

+0

मैं भी आश्चर्यचकित था ... इसका कोई बड़ा कारण नहीं है ... लेकिन ऐसा लगता है कि एसटीएल इसके साथ काम नहीं करेगा ... इसके अलावा ... मैं केवल WCHAR का उपयोग करने के लिए फ़ंक्शन को बदल दूंगा, लेकिन यह एक डीएलएल नहीं है जिसे मैं बदल सकता हूं। –

उत्तर

6

ऐसा लगता है कि आप C++ मानक लाइब्रेरी स्ट्रिंग क्लास का उपयोग करने का प्रयास कर रहे हैं। मुझे संदेह है कि मार्शल के लिए आसान होगा। एक char * और मार्शल स्ट्रिंगबिल्डर के रूप में चिपकने के लिए बेहतर है। मैं आमतौर पर यही करता हूं। आपको एक रैपर जोड़ना होगा जो आपके लिए सी ++ स्ट्रिंग उत्पन्न करता है।

+0

मैं उस से डर गया था ... आंकड़े –

2

PInvoke इंटरऑप सहायक केवल सी ++ का समर्थन करता है। दुर्भाग्य से एमएफसी स्ट्रिंग क्लास (सीएसटींग मुझे विश्वास है?) सी ++ है और सहायक के माध्यम से काम नहीं करेगा। इसके बजाय निम्नलिखित

void SetPath(__in const WCHAR* path); 
0

हां का उपयोग करने का प्रयास करें। आप ऐसा कर सकते हैं। दरअसल, न केवल 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

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