DLLImport Int** — Как это сделать, если это возможно
Вопрос
Я пытаюсь использовать стороннюю DLL, которой требуется int** в качестве одного из параметров метода.Он описывает параметр как адрес указателя, который будет указывать на выделение памяти.
Извините за путаницу.Я думаю, что параметр двусторонний.DLL предназначена для связи с платой FPGA, а метод настройки передачи DMA между главным ПК и платой PCI.
Решение
Используйте ссылку 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;
}
Другие советы
В этом случае вам придется использовать класс Marshal, иначе вы будете небезопасны.
Это также может быть просто указатель на массив, поэтому ref int[] list
может работать.
Int** будет массивом IntPtr. Судя по вашему описанию, я думаю, вы, возможно, захотите изучить использование C++/CLI, чтобы помочь вам с преобразованиями, например, из неуправляемого int** в управляемый массив^>^