Вопрос по pinvoke, interop, dllimport, c# – DLLImport Int ** - Как это сделать, если это можно сделать

5

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

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

Ваш Ответ

3   ответа
1

этом случае.

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

Это то, что я буду иметь в виду, если другой путь нет работа. Robin Robinson
Если вы передаете данные в функцию, это может быть самым простым. leppie
0

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

7

Используйте 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;
  }
Использование ref IntPtr, похоже, компилируется и выполняется. У меня есть немного дальше, пока я не знаю, что это полностью работает. Robin Robinson
С тех пор'с передачей информации, предпочтительнее JaredPar
Как мне конвертировать int [] в IntPtr? Robin Robinson

Похожие вопросы