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.

¿Fue útil?

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top