在C#

时间:2018-11-26 00:09:24

标签: c# c++ unity3d marshalling unmanaged

我想在C#脚本中使用c ++代码在统一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值。

我想对另一个指向存储位置的指针矩阵的float指针执行 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)

0 个答案:

没有答案