Frage

Ich versuche, eine dritte Partei DLL zu verwenden, die einen int ** als einer der Parameter der Methode will. Es beschreibt die Parameter als die Adresse des Zeigers, die auf die Speicherzuweisung verweisen.

Sorry für die Verwirrung. Der Parameter ist Zwei-Wege denke ich. Die DLL ist für das Gespräch mit einem FPGA-Board und das Verfahren der Einrichtung DMA-Transfers zwischen dem Host-PC und der PCI-Karte.

War es hilfreich?

Lösung

Verwenden Sie eine durch-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;
  }

Andere Tipps

Du musst Verwendung der Marshal-Klasse machen oder in diesem Fall geht unsicher.

Es könnte auch nur ein Zeiger auf ein Array sein, so dass ein ref int[] list funktionieren könnte.

Ein int ** würde von IntPtr und Array, aus Ihrer Beschreibung Ich glaube, Sie könnten in aussehen soll C ++ / CLI verwenden Sie die Konvertierungen von einem nicht verwalteten int ** auf ein verwaltetes Array ^> ^ zB zu helfen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top