Pergunta

Eu estou tentando usar um terceiro DLL partido que quer um int ** como um dos parâmetros para o método. Ele descreve o parâmetro como o endereço do ponteiro que irá apontar para a alocação de memória.

Pedimos desculpas por qualquer confusão. O parâmetro é bidirecional eu acho. A DLL é para falar com uma placa FPGA eo método é a criação de transferência DMA entre o PC host ea placa PCI.

Foi útil?

Solução

Use um 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;
  }

Outras dicas

Você terá que fazer uso da classe Marshal ou ir inseguro neste caso.

Ele também poderia ser apenas um ponteiro para uma matriz, portanto, um trabalho ref int[] list poder.

Um int ** seria e variedade de IntPtr, a partir de sua descrição Eu acho que você pode querer olhar em usar C ++ / CLI para ajudá-lo com a conversões por exemplo, de um int não gerenciado ** para uma matriz conseguiu ^> ^

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top