2008-10-16 7 views
5

Я пытаюсь использовать стороннюю DLL, которая хочет использовать int ** в качестве одного из параметров метода. Он описывает параметр как адрес указателя, который указывает на выделение памяти.DLLImport Int ** - Как это сделать, если это можно сделать

Извините за путаницу. Думаю, этот параметр двусторонний. DLL предназначен для разговора с платой FPGA, и этот метод устанавливает передачу DMA между главным компьютером и PCI-платой.

ответ

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 2008-10-16 16:48:12

+0

Как преобразовать int [] в IntPtr? – 2008-10-16 16:48:31

1

Вам необходимо будет использовать класс маршала или пойти небезопасно в этом случае.

Это может быть просто указатель на массив, поэтому может работать ref int[] list.

0

An int ** будет и массив IntPtr, из вашего описания, я думаю, вы можете захотеть изучить использование C++/CLI, чтобы помочь вам с преобразованиями, например, из неуправляемого int ** в управляемый массив ^>^