Я хочу использовать код 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)