64 ビットの .NET 4。C にマーシャリングする予定の C# 構造があります。
[StructLayout(LayoutKind.Sequential)]
public struct ParentStruct
{
public float[] FArray;
public int FArrayLength;
}
に
struct ParentStruct
{
float* FArray;
int FArrayLength;
};
ここでの特別な状況は、コピーする必要がある配列float[] FArray
が常に固定されており、要素が 0 であり、そのポインターをネイティブにコピーすることだけに関心があり、それが持つ実際の要素 (どれもありません!) やメモリの割り当てには関心がないことです。フリー ストア (ヒープ) のネイティブ側は、ガベージ ロケーションを指しますが、これで問題ありません。
これを行う技術的な理由はfloat[] FArray
、GPU メモリ上のアドレスを指しており、GPU にマーシャリングされると、正しいデータを指していることです。
この構造体を C にマーシャリングできるようにしたいのですが、適切なマーシャリング方法がわかりません
- 私は現在の構造でそれをマーシャリングしようとしました、私は得ました
Object contains non-primitive or non-blittable data.
- 追加
[MarshalAs(UnmanagedType.LPArray)]
してみましたが、取得していましたType 'Test.ParentStruct' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed.
ところで、これらのエラーが発生する理由は理解しています。実際に必要なのは、配列が変数配列ではなく (相互運用ライブラリでは配列のように見えます)、構造体を考えることができることを考えると、マーシャリングする方法です。固定サイズとして。
注:インテリセンスやその他の制約のため、a またはそのようなものfloat[]
ではなくa を使用する必要があります。uint