3

をラップして、タイプ セーフなポインター構造を作成したいと思いますIntPtr

struct Pointer<T>
{
    private IntPtr ptr;

    // methods marshalling from and to T
}

Pointer<T>しかし、インスタンスを s であるかのようにマーシャリングできるようにしたいIntPtrので、同じサイズとレイアウトにする必要があります。それは保証されていますか?

そうでない場合は、追加しますか

[StructLayout(LayoutKind.Sequential, Pack = 1)]

頂点で?

基本的に、最後にこの C 構造体をマーシャリングできるはずです

struct Foo {
    int *data;
};

この C# 構造体を使用して:

struct Foo
{
    public Pointer<int> data;
}
4

2 に答える 2

3

そのままで大丈夫です。助ける必要はありません。

C# の構造体型は自動的に [StructLayout] 属性を取得します。デフォルトは Sequential で、パッキングは 8 です。これは、アンマネージ コードでデフォルトで使用されるのと同じ種類のパッキングです。構造体にフィールドが 1 つしかない場合でも問題ありません。

フィールドを追加せず、自動プロパティを使用しないようにしてください。Marshal.SizeOf() で再確認できます。32 ビット モードでは 4、64 ビット モードでは 8 である必要があります。つまり、IntPtr.Size に等しい

于 2013-08-07T12:07:44.683 に答える
0

[StructLayout(LayoutKind.Sequential, Pack = 1)] を追加すると、構造体内の変数の配置にのみ影響し、それ自体の変数のサイズには影響しません。それらはまだ 32 ビット/64 ビットです。

于 2013-08-07T11:59:26.507 に答える