Доступ к значениям неуправляемого указателя C ++ на указатель в C # - PullRequest
0 голосов
/ 26 ноября 2018

Я хочу использовать код c ++ в моих скриптах C # для рендеринга некоторых объектов в Unity 3D.

Я скомпилировал скрипт C ++ как dll (lammps.dll) и написал скрипт C # для вызованесколько функций из скрипта C ++.

Я могу успешно получить доступ к указателям void * и int *, выполнив следующие действия:

Пример:

  C++ prototype:
  void *lammps_extract_global(void *ptr, char *name);

  Equivalent C# prototype (in CSharpLibrary.cs file):

   DllImport("lammps.dll", EntryPoint = "lammps_extract_gloabl", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall);
   public static extern IntPtr lammps_extract_global(IntPtr ptr, [MarshalAs(UnmamanegType.LPStr)]String name);

Затем я компилирую файл C # как файл, который выдает CSharpLibrary.dll

В другом скрипте C # я использую оболочку CSharpLibrary для доступа к функциям C ++:

  1.  First define lmp_ptr as,
  var lmp_ptr = Marshal.AllocHGlobal(Marshal.Sizeof(typeof(System.IntPtr)));

  2.  Get lmp_ptr from C++ and dereference it as,
  var deref1 = (System.IntPtr)Marshal.PtrToStructure(lmp_ptr, typeof(System.IntPtr))

  3.  Then use deref1 to get natmPtr as, 
  System.IntPtr natmPtr = CSharpLibrary.CSharpLibrary.lammps_extract_global(deref1, "natoms");


   4. Convert natmPtr to an integer as,
    int nAtom = (int)Marshal.PtrToStructure(natmPtr, typeof(int))

Шаг 4 даетмне подходит значение nAtom.

Я хочу сделать то же самое, что и для nAtom для другого плавающего указателя на позиции хранения матрицы указателя.

   I did this to get the float pointer to pointer reference in C# 

Учитывая, что lammps_extract_atom был определен аналогично функции, описанной выше, мы имеем

   System.IntPtr posPtr = CSharpLibrary.CSharpLibrary.lammps_extract_atom(deref1, "x")

   Here posPtr is a float** value being returned from C++

Подобное утверждение в C ++ выглядело бы как

  float** posPtr = (double**)(lammps_extract_atom)(void *lmp_ptr, char *name)
...