わかりました、これは機能しています:
[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()」への呼び出しは正常に機能します。
誰かがこれを理解できるかどうか見てみましょう。;)