【问题标题】:What is the difference between C# marshaled struct pointers?C#封送结构指针有什么区别?
【发布时间】: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


【解决方案1】:

结构必须是blittable 才能创建指向它的指针。第二个结构不是 blittable,bool 字段是麻烦制造者。您必须改为将其设为 byte 或 int,具体取决于意图。

available here 概述了 .NET 中可以 blitable 的类型。

异常消息的建议非常合理,请将参数声明为 ref ValueProxy,而不是将其留给 pinvoke 编组器来创建具有所需布局的结构副本。

【讨论】:

  • 你先生太棒了,谢谢。 ;) 我认为 bool 是“确定的事情”(因为我已经知道非 blittable 类型的问题)但我没有意识到 bool 不是其中之一。我认为这是一个非常愚蠢的情况,但我想因为本机可能存在 8 位或 32 位布尔值(取决于编译器),这可能有点道理。 ;) 很遗憾,像往常一样,MS 很难找出这些无用的错误消息发生了什么。它应该是“结构不可复制”之类的东西。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 2021-09-21
相关资源
最近更新 更多