DLLImport Int ** - Cómo hacer esto si se puede hacer
Pregunta
Estoy tratando de usar una DLL de terceros que quiere un int ** como uno de los parámetros del método. Describe el parámetro como la dirección del puntero que apuntará a la asignación de memoria.
Perdón por cualquier confusión. El parámetro es bidireccional, creo. La DLL es para hablar con una placa FPGA y el método es configurar la transferencia DMA entre la PC host y la placa PCI.
Solución
Utilice un by-ref 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;
}
Otros consejos
Tendrás que hacer uso de la clase Marshal o no ser seguro en este caso.
También podría ser solo un puntero a una matriz, por lo que una ref int [] list
podría funcionar.
Un int ** sería una matriz de IntPtr, por su descripción, creo que es posible que desee considerar el uso de C ++ / CLI para ayudarlo con las conversiones, por ejemplo, de una int ** no administrada a una matriz administrada ^ > ^