DLLImport Int ** - Как это сделать, если это можно сделать - PullRequest
5 голосов
/ 16 октября 2008

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

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

Ответы [ 3 ]

7 голосов
/ 16 октября 2008

Используйте 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;
  }
1 голос
/ 16 октября 2008

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

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

0 голосов
/ 16 октября 2008

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

...