DLLImport Int ** - Come fare se è possibile farlo
Domanda
Sto cercando di utilizzare una DLL di terze parti che desidera un int ** come uno dei parametri del metodo. Descrive il parametro come l'indirizzo del puntatore che punterà all'allocazione della memoria.
Ci scusiamo per qualsiasi confusione. Penso che il parametro sia bidirezionale. La DLL serve per comunicare con una scheda FPGA e il metodo prevede l'impostazione del trasferimento DMA tra il PC host e la scheda PCI.
Soluzione
Utilizza 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;
}
Altri suggerimenti
Dovrai utilizzare la classe Maresciallo o non essere sicuro in questo caso.
Potrebbe anche essere solo un puntatore a un array, quindi un ref int [] list
potrebbe funzionare.
Un int ** sarebbe e un array di IntPtr, dalla tua descrizione penso che potresti voler esaminare l'uso di C ++ / CLI per aiutarti con le conversioni, ad esempio da un int non gestito ** ad un array gestito ^ > ^