7

わかりました、これは機能しています:

[StructLayout(LayoutKind.Explicit, Size = 28)]
public unsafe struct HandleProxy
{
    [FieldOffset(0), MarshalAs(UnmanagedType.I4)]
    public JSValueType _ValueType; // JSValueType is an enum

    [FieldOffset(4), MarshalAs(UnmanagedType.I4)]
    public Int32 _ManagedObjectID; 

    [FieldOffset(8)]
    public void* _NativeEngineProxy;

    [FieldOffset(16), MarshalAs(UnmanagedType.I4)]
    public Int32 _EngineID;

    [FieldOffset(20)]
    public void* _Handle;
}

[DllImport("Proxy")]
public static extern void DisposeHandleProxy(HandleProxy* handle);

...そしてこれは...

[StructLayout(LayoutKind.Explicit, Size = 20)]
public unsafe struct ValueProxy
{
    [FieldOffset(0), MarshalAs(UnmanagedType.I4)]
    public JSValueType _ValueType; // 32-bit type value.

    [FieldOffset(4), MarshalAs(UnmanagedType.Bool)]
    public bool _Boolean;

    [FieldOffset(4), MarshalAs(UnmanagedType.I4)]
    public Int32 _Integer;

    [FieldOffset(4)]
    public double _Number;

    [FieldOffset(12)]
    public void* _String;
}

[DllImport("Proxy")]
public static extern void DisposeValueProxy(ValueProxy* valueProxy);

それで、違いは何ですか?何かが足りない。"DisposeValueProxy() を呼び出すと、次のエラーが発生します。

「'パラメーター #1' をマーシャリングできません: ポインターは、マーシャリングされた構造を参照できません。代わりに ByRef を使用してください。」

(はい、「ValueProxy*」の代わりに単に IntPtr/void* を使用できますが、それは私のポイントではありません)。

「DisposeHandleProxy()」への呼び出しは正常に機能します。

誰かがこれを理解できるかどうか見てみましょう。;)

4

1 に答える 1

9

構造体へのポインターを作成するには、構造体がblittableである必要があります。2 番目の構造体は blittable ではなく、boolフィールドがトラブルメーカーです。意図に応じて、代わりにバイトまたは整数にする必要があります。

.NET で blittable な型の概要については、こちらを参照してください。

例外メッセージのアドバイスは非常に適切なものref ValueProxyです。目的のレイアウトで構造体のコピーを作成するために、代わりに pinvoke マーシャラーに任せて引数を宣言してください。

于 2013-05-20T18:18:18.187 に答える