2008-10-16 18 views
5

Yöntemde parametrelerden biri olarak int ** isteyen bir üçüncü taraf DLL kullanmak çalışıyorum. Parametreyi, bellek ayırmasına işaret edecek işaretçinin adresi olarak tanımlar.DLLImport Int ** - Nasıl yapılırsa bu nasıl yapılır

Herhangi bir karışıklık için özür dilerim. Bu parametre iki yönlüdür. DLL, bir FPGA panosuyla konuşmak içindir ve yöntem, ana bilgisayar ve PCI kartı arasında DMA aktarımı kurmaktır.

cevap

7

System.IntPtr ile bir ref kullanın.

[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

Bilgiyi dışarı aktardığından, dışarı çıkmak tercih edilir – JaredPar

+0

Bir int [] özelliğini IntPtr'ye nasıl dönüştürebilirim? –

+0

Ref IntPtr öğesinin kullanılması derleniyor ve çalışıyor gibi görünüyor. Tamamen çalıştığını bilene kadar biraz daha ilerlemem gerek. –

1

Marshal sınıfından faydalanmanız veya bu durumda güvensiz davranmanız gerekecektir.

Ayrıca bir dizi için bir işaretçi de olabilir, bu nedenle ref int[] list çalışabilir.

+0

Bu, başka bir şekilde işe yaramazsa aklımda tutulacağım bir şeydir. –

+0

Verileri işleve iletiyorsanız, bu en kolay olabilir. – leppie

0

Bir int ** olabilir ve IntPtr dizisi, açıklamasından dolayı dönüşümler konusunda size yardımcı olmak için C++/CLI kullanmayı düşünebilirsiniz. Örneğin yönetilmeyen int ** 'dan yönetilen bir diziye ^>^