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.

È stato utile?

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 ^ > ^

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top