2

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

4

0 に答える 0