Вопрос

Я пытаюсь использовать стороннюю DLL, которой требуется int** в качестве одного из параметров метода.Он описывает параметр как адрес указателя, который будет указывать на выделение памяти.

Извините за путаницу.Я думаю, что параметр двусторонний.DLL предназначена для связи с платой FPGA, а метод настройки передачи DMA между главным ПК и платой PCI.

Это было полезно?

Решение

Используйте ссылку 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;
  }

Другие советы

В этом случае вам придется использовать класс Marshal, иначе вы будете небезопасны.

Это также может быть просто указатель на массив, поэтому ref int[] list может работать.

Int** будет массивом IntPtr. Судя по вашему описанию, я думаю, вы, возможно, захотите изучить использование C++/CLI, чтобы помочь вам с преобразованиями, например, из неуправляемого int** в управляемый массив^>^

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top