我想在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)