2008-10-16 38 views
5

मैं एक तृतीय पक्ष DLL का उपयोग करने की कोशिश कर रहा हूं जो int ** को विधि के पैरामीटर में से एक के रूप में चाहता है। यह पैरामीटर को सूचक के पते के रूप में वर्णित करता है जो स्मृति आवंटन को इंगित करेगा।DLLImport Int ** - यह कैसे किया जा सकता है अगर यह किया जा सकता है

किसी भी भ्रम के लिए खेद है। पैरामीटर दो तरह से मुझे लगता है। डीएलएल एक एफपीजीए बोर्ड से बात करने के लिए है और यह तरीका मेजबान पीसी और पीसीआई बोर्ड के बीच डीएमए हस्तांतरण स्थापित कर रहा है।

उत्तर

7

एक बाय-रेफ System.IntPtr का उपयोग करें।

[DllImport("thirdparty.dll")] 
static extern long ThirdPartyFunction(ref IntPtr arg); 

long f(int[] array) 
    { long retval = 0; 
    int size = Marshal.SizeOf(typeof(int)); 
    var ptr = IntPtr.Zero; 

    try 
    { ptr = Marshal.AllocHGlobal(size * array.Length); 

     for (int i= 0; i < array.Length; ++i) 
     { IntPtr tmpPtr = new IntPtr(ptr.ToInt64() + (i * size)); 
      Marshal.StructureToPtr(array, tmpPtr, false); 
     } 

     retval = ThirdPartyFunction(ref ptr); 
    } 
    finally 
    { if (ptr != IntPtr.Zero) Marshal.FreeHGlobal(ptr); 
    } 

    return retval; 
    } 
+0

चूंकि यह जानकारी पास कर रहा है, – JaredPar

+0

रेफरी करने के लिए बेहतर है I int [] को intPtr में कैसे परिवर्तित करूं? –

+0

रेफ इंटिप्ट का उपयोग संकलन और चल रहा है। मेरे पास जाने के लिए थोड़ा और आगे है जब तक कि मुझे पता न हो कि यह पूरी तरह से काम कर रहा है। –

1

आपको मार्शल क्लास का उपयोग करना होगा या इस मामले में असुरक्षित होना होगा।

यह एक सरणी के लिए एक सूचक भी हो सकता है, इसलिए ref int[] list काम कर सकता है।

+0

यह ऐसा कुछ है जिसे मैं ध्यान में रखूंगा यदि अन्य तरीका काम नहीं करता है। –

+0

यदि आप फ़ंक्शन में डेटा पास कर रहे हैं, तो यह सबसे आसान हो सकता है। – leppie

0

एक int ** आपके विवरण से IntPtr का होगा और सरणी होगी, मुझे लगता है कि आप रूपांतरणों की सहायता के लिए सी ++/सीएलआई का उपयोग करना चाहते हैं जैसे कि एक अप्रबंधित int ** से प्रबंधित एरे में ^>^

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