В чем разница между указателями структуры c#?

Ok, это работает:

[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."

(и да, я могу просто использовать IntPtr/void* вместо " ValueProxy*", но это не моя точка зрения).

вызов " DisposeHandleProxy()" работать отлично.

давайте посмотрим, может ли кто-то понять это. ;)

1 ответов


структура должна быть blittable создать указатель на него. Вторая структура не является преобразуемым, в bool поле-это баламут. Вместо этого вам придется сделать его байтом или int, в зависимости от намерения.

обзор того, какие типы являются blittable в .NET является здесь.

совет сообщения об исключении очень здравый, объявите аргумент как ref ValueProxy вместо того, чтобы оставить его до маршаллера pinvoke создайте копию структуры с требуемым макетом.