您已经描述了 PostT 的外观,但这还不够。首先,必须知道函数期望作为 ***PostT 参数传递的内容,然后才能考虑从 C++ 或 C# 端调用它。
我知道这可能不符合您的意愿,但请看:
PosT p;
PosT* ptr = &p;
PosT** ptr2 = &ptr;
PosT*** ptr3 = &ptr2;
func(...., ptr3, ...); // OK!?
PosT* ptr = new PosT[123];
PosT** ptr2 = &ptr;
PosT*** ptr3 = &ptr2;
func(...., ptr3, ...); // OK!?
PosT** ptr2 = new PosT[5];
for(int i=0;i<5;++i) ptr2[i] = new PosT[123];
PosT*** ptr3 = &ptr2;
func(...., ptr3, ...); // OK!??
等等。我快速构建的哪个内存结构对于该功能是正确的?这决定了您必须从 C# 端传递的数据类型。
如果该函数采用您称为“对锯齿状阵列的可变引用”的东西(所以我提供的最后一个示例),那么 P/Invoke 声明将是:
[..extern..]
void func(....., ref PosT[][] posArray, ...);
调用类似于:
func(...., new PosT[][] {
new PosT[] { new PosT{ d = ... }, new PosT{ d = ... }, ... },
new PosT[] { new PosT{ d = ... }, new PosT{ d = ... }, ... },
... },
.... );
但是,请先检查这个函数的期望。有了*真的有太多的可能性只是猜测。你说它来自一些 API - 首先检查它的文档!告诉我们这个函数到底需要什么,我/有人会告诉你如何在 C# 中构建这样的 POD。反之则行不通!:)
PS。对不起,糟糕的 C++/C# 代码,我很匆忙,只有几分钟的时间来写这个:/