これを行うには複数の方法があるようですが、試した例は私のために働いていません。PInvokeスタイルのメンバーを持つ構造体を渡すポインタの動的配列
安全でないポインタを使用すると、ポインタを必要とするより複雑な構造に移行する方法があります。私はSubStructは、(署名がInteropされていないマーシャリングすることができないと言うエラーが出る
unsafe public struct ComplexStruct {
public Int32 NumSubStruct;
public SubStruct*[] arr;
}
unsafe public static extern UInt32 DLL_Call(ref ComplexStruct p);
function {
unsafe {
ComplexStruct p = new ComplexStruct();
p.NumSubStruct = 2;
p.arr= new SubStruct*[p.NumSubStruct];
SubStruct p1 = new SubStruct();
SubStruct p2 = new SubStruct();
p.arr[0] = &p1;
p.arr[1] = &p2;
testLogHandlerHandle = DLL_Call(ref p);
}
}
:(申し訳ありませんが、私は再びソースを見つけることができませんでした)
私の最新の試みは、次のようになります互換性あり)。
マーシャルなしでオブジェクトを渡すことはできますか? (DLLはC#アプリケーションと同じプロセス・スペースにロードする必要があります)。
もしそうでなければ、オブジェクトのコピーを渡す最も簡単な方法は何でしょうか?
注:DLLを変更することは問題ありません。私は、C++やCLIのような他のソリューションを漠然と認識していますが、そのような方法で渡す必要のある構造型は比較的少数です。
EDIT: いくつかの注意事項:
- 配列は、実際の構造体は、もう少し複雑なダイナミック
をすることによってする必要があります(このようなネストされた構造の4層があります)ので、私は追加することだと思います彼らは質問を損なうが、完全を期すために、ここで私はC++でこれらを宣言するだろうかあるでしょう:
struct ComplexStruct { unsigned int NumSubStruct; SubStruct** arr; }; struct SubStruct { unsigned int NumSubStruct; //some more datamembers here as well SubSubStruct** arr; };
(余分な間接は必要ありませんが、私はIntPtrsとしてSubStructポインタの配列を宣言できるようにするには便利かもしれません考え出し)
2つの構造体のC++宣言を表示できますか?個人的には、私は「不安全」が行く方法であることを非常に疑う。 –
余計な間接指示があなたを傷つけるでしょう。それがなければ簡単になるでしょう。 –