【发布时间】:2013-05-20 17:50:20
【问题描述】:
好的,这正在工作:
[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()”可以正常工作。
让我们看看是否有人可以解决这个问题。 ;)
【问题讨论】:
-
你如何定义“不工作”?
-
刚刚更新了帖子,谢谢。
-
对于我的生活,我无法理解你为什么在这里使用显式布局。我也不认为需要
unsafe。 -
这很简单,我从本机端访问联合中的值。我读取的字段取决于类型。这是为了支持来自本机库的动态值(不是我写的)。 unsafe 修饰符是必需的,因为那里有一个指针。
标签: c# struct marshalling