PosTがどのように見えるかを説明しましたが、これだけでは不十分です。まず、関数が*** PosT引数として渡されることを期待していることを知っておく必要があります。そうすれば、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#側から渡す必要のあるデータ型を決定するものです。
関数が「ギザギザのarayへの可変参照」と呼ぶものを受け取る場合(つまり、私が提供した最後の例)、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#コードでごめんなさい、私は急いでいて、これを書くのにほんの数分しかありませんでした:/