2013-10-18 2 views
5
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Runtime.InteropServices; 

namespace PatternSequencer 
{ 
    class Version 
    { 
     public string majorVersion; 
     public string minorVersion; 

     ushort* pmajorVersion; 
     ushort* pminorVersion; 
     ulong status; 

     [DllImport(@"c:\DOcuments\Myapp.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")] 
     public static extern ulong SRX_DllVersion(ushort* pmajorVersion, ushort* pminorVersion); 


     public Version() 
     { 
      status = SRX_DllVersion(&pmajorVersion, &pminorVersion); 
      if (status) 
      { 
       majorVersion = "1 - " + *pmajorVersion; 
       minorVersion = "1 - " + *pminorVersion; 
      } 
      else 
      { 
       majorVersion = "0 - " + *pmajorVersion; 
       minorVersion = "0 - " + *pminorVersion; 
      } 
     } 
    } 
} 

से इनपुट तर्क के रूप में पॉइंटर्स लेता है यह एक त्रुटि पॉइंटर्स फेंकता है और निश्चित आकार बफर केवल एक असुरक्षित संदर्भ में उपयोग किया जा सकता है। मैं सी ++ डीएलएल को पॉइंटर्स कैसे पास करूं? मैं सी # करने के लिए नया हूँ, कृपया मेरी मददसी ++ फ़ंक्शन का उपयोग कैसे करें जो सी #

+2

पैरामीटर को 'रेफरी' के रूप में घोषित करें, जो 'असुरक्षित' कोड की आवश्यकता को खत्म कर देगा। – William

+0

@ विलियम: क्या आप विस्तार से समझा सकते हैं। मैं सी # – user2495173

+0

पर नया हूं जो आप यहां करना चाहते हैं [मार्शलिंग] (http://msdn.microsoft.com/en-us/magazine/cc164193.aspx) के रूप में जाना जाता है। यह एक बड़ा विषय है, लेकिन इस तरह के साधारण मामलों के लिए, यह बहुत कठिन नहीं है। –

उत्तर

8

बल्कि एक unsafe संदर्भ कोशिश का उपयोग करने से:

[DllImport(@"c:\FreeStyleBuild\BERTScope\Release\Bin\BitAlyzerDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")] 
public static extern ulong SRX_DllVersion(out ushort pmajorVersion, out ushort pminorVersion); 

कॉल करने के लिए:

ushort major, minor; 
SRX_DllVersion(out major, out minor); 

मैं, SRX_DllVersion मापदंडों केवल उत्पादन कर रहे हैं संभालने हूँ अगर ref करने के लिए out परिवर्तन नहीं।

जब भी संभव हो unsafe कोड से बचें।

+0

यह निश्चित रूप से जाने का तरीका है; यहां असुरक्षित कोड का उपयोग करने का कोई कारण नहीं है। –

+0

बिल्कुल सही काम करता है !! बहुत बहुत धन्यवाद :) मैं इसके बारे में और कहां पढ़ सकता हूं? – user2495173

+0

[प्लेटफार्म आमंत्रण के साथ मार्शलिंग डेटा] (http://msdn.microsoft.com/en-us/library/fzhhdwae.aspx) और [PInvoke.net] (http://pinvoke.net) यदि आपको नमूने या आम की आवश्यकता है आयात। – William

1

आपको लगता है कि विधि के रूप में चिह्नित करना होगा unsafe

[DllImport(@"c:\FreeStyleBuild\BERTScope\Release\Bin\BitAlyzerDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")] 
public static extern ulong SRX_DllVersion(out ushort pmajorVersion, out ushort pminorVersion); 
+0

यह काम नहीं करता है। मेरा पूरा कोड यहां है: – user2495173

+0

@ user2495173 यदि आप इसे प्रासंगिक पाते हैं तो पूर्ण कोड शामिल करने के लिए कृपया अपना प्रश्न संपादित करें। – Renan

+1

उस वाक्यविन्यास का उपयोग उस ब्लॉक के लिए किया जा सकता है जो किसी विधि (या कन्स्ट्रक्टर, एक्सेसर) के शरीर का हिस्सा है। एक संपूर्ण वर्ग सदस्य ब्लॉक के अंदर नहीं है। –

3

बेशक आप यह काम करने के लिए वर्ग unsafe चिह्नित करने के लिए किया है।

unsafe class Version 
{ 
    [DllImport(@"c:\FreeStyleBuild\BERTScope\Release\Bin\BitAlyzerDLL.dll", CallingConvention = CallingConvention.Cdecl, EntryPoint = "SRX_DllVersion")] 
    public static extern ulong SRX_DllVersion(ushort* pmajorVersion, ushort* pminorVersion); 
} 

यदि आपके पास केवल एक ही विधि है तो आप विधि को unsafe के रूप में चिह्नित कर सकते हैं।

और "असुरक्षित कोड" कंपाइलर विकल्प को भी चालू करने के लिए मत भूलना।

0

unsafe ब्लॉक का उपयोग करने का प्रयास करें। unsafe के बारे में अधिक जानकारी।

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