私のC#コードでコールバック関数を定義し、それをネイティブC++コードに渡してから、後でC++コードを呼び出すようにします。コールバックは、構造体の可変長配列を受け取る必要があります。各構造体にはいくつかの配列フィールドが含まれています。C++からC#への配列フィールドを含む構造体の整列配列
配列フィールドを持つ単一の構造体と、スカラーフィールドを持つ構造体の可変長配列を渡しますが、配列フィールドを持つ構造体の可変長配列は渡すことはできませんでした。
私のC#コードです。私はそれが問題だとは思わないので、C#コードでC#コールバックメソッドを登録するコードを省略しています。問題のある特定の場合を除いて正常に動作します。
構造体:
[StructLayout(LayoutKind.Sequential)]
public struct Foo
{
[MarshalAs(UnmanagedType.ByValArray, ArraySubType=UnmanagedType.R4, SizeConst = 2)]
public float[] a;
}
コールバック宣言
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
delegate void Callback(Int32 count,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 1)] Foo[] foos);
コールバックメソッド自体
public void onFoo(Int32 count, Foo[] foos) {
Debug.Log("in onFoo callback, foo values=" + foo[0].a + ", " + foo[1].a);
}
そして、ここでは、C++のコードです:
まず構造体:
typedef struct {
float a[2];
} Foo;
とコールバックの呼び出し:問題のあるケースでは
Foo* foos = new Foo[2];
foos[0].a[0] = 1.11;
foos[0].a[1] = 2.22;
foos[1].a[0] = 3.33;
foos[1].a[1] = 4.44;
onFoo(2, foos);
delete[] foos;
、私のコールバックメソッドは、(私は、ログ出力を取得していない)が呼び出されていません。私はかなりのグーグルを行ってきましたが、この特定のシナリオをカバーするものは何も見つかりませんでした。カスタムマーシャラが必要ですか?
定義によるリストは可変長なので、 'List'コンテナを使用できますか? –
C++のstd :: listを意味しますか?どのようにC#にマーシャリングされますか? –
わかりませんでした。私はもはやC++で動作しません。 –