2010-10-10 6 views
5

लगता है एक dll निम्नलिखित कार्यमंच आह्वान, bool और स्ट्रिंग

extern "C" __declspec(dllexport) void f(bool x) 
{ 
    //do something 
} 
extern "C" __declspec(dllexport) const char* g() 
{ 
    //do something else 
} 

मेरी पहली अनुभवहीन दृष्टिकोण इस प्रकार था सी # से इन कार्यों का उपयोग करने में शामिल हैं:

[DllImport("MyDll.dll")] 
internal static extern void f(bool x); 
[DllImport("MyDll.dll")] 
internal static extern string g(); 

पहले आश्चर्य है कि था सी ++ बूल सी # बूल में परिवर्तित नहीं होता है (अजीब रनटाइम व्यवहार, लेकिन कोई दुर्घटना नहीं है)। तो मुझे बूल को बाइट में बदलना पड़ा और हाथ से एक दूसरे से बदलना पड़ा। तो, पहला सवाल यह है कि क्या मार्शल बूल का कोई बेहतर तरीका है (ध्यान दें कि यह बूल है, न कि बूल)

दूसरा आश्चर्य यह था कि डीएलएल फ़ंक्शन द्वारा लौटाई गई कच्ची स्ट्रिंग सी # स्ट्रिंग द्वारा कॉपी की गई थी, कॉपी नहीं की गई थी , जैसा कि मैं उम्मीद करता हूं, और अंततः सी # कोड डीएल द्वारा लौटाई गई स्मृति को मुक्त करता है। मैंने इसे पाया क्योंकि प्रोग्राम क्रैश हो गया था, लेकिन फिर मैंने रिटर्न टाइप को sbyte * में बदल दिया और मैन्युअल रूप से उस पॉइंटर के साथ स्ट्रिंग को प्रारंभ किया जो पहले से ही प्रतिलिपि करता है। तो दूसरा सवाल यह है: 2.1: क्या मार्शल स्ट्रिंग को पॉइंटर के मालिक से रोकने के लिए कोई बेहतर तरीका है। 2.2: डब्ल्यूटीएफ ?! सी # ऐसा क्यों करता है? मेरा मतलब है, एक स्पष्ट मामला तब होता है जब डीएलएल func एक शाब्दिक लौटाता है, और सी # इसे हटाने की कोशिश करता है ...

अग्रिम धन्यवाद, और उम्मीद है कि मेरे प्रश्न अस्पष्ट या समझ में नहीं आ रहे हैं।

उत्तर

5
[DllImport("MyDll.dll")] 
internal static extern void f([MarshalAs(UnmanagedType.I1)] bool x); 
[DllImport("MyDll.dll")] 
[return: MarshalAs(UnmanagedType.LPStr)] 
internal static extern string g(); 
5

डिफ़ॉल्ट रूप से सी ++ बूल (4 बाइट्स) और .NET बूल प्रकार के बीच .NET मार्शल। सी ++ bool (एकल बाइट) के लिए टाइप करें आप कैसे मार्शल करने के लिए निर्दिष्ट करने की आवश्यकता:

[DllImport("MyDll.dll")] 
internal static extern void f([MarshalAs(UnmanagedType.I1)] bool x); 
+0

@Darin: अजीब बात अपने दोस्तों में से एक ने मुझे बिल्कुल वही बात से कहा, और लगता है क्या है? यह काम नहीं किया। मैं .Net1.1 का उपयोग कर रहा हूं यदि यह प्रासंगिक –

+1

असल में यह 1.1 से समर्थित है। यहां देखें http://msdn.microsoft.com/en-us/library/system.runtime.interopservices.unmanagedtype(v=VS.71).aspx – Vinzenz

+0

@ आर्मेन इसे दस्तावेज़ीकरण के अनुसार काम करना चाहिए। –

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