【问题标题】:xamarin.ios binding objective-c union | Marshalling custom typesxamarin.ios 绑定objective-c union |编组自定义类型
【发布时间】:2016-11-09 18:35:28
【问题描述】:

大家好! 我在为 Objective-C 框架创建绑定项目时遇到了一个问题。 我在 Objective-C 中有以下结构定义:

typedef struct {
SCIDataType type;
union {
    char charData;
    short int16Data;
    int int32Data;
};
} SCIGenericType;

这是 Binding 项目中我的 Structs.cs 文件中的 C# 代码:

[StructLayout(LayoutKind.Sequential)]
public struct SCIGenericType
{
    public SCIDataType type;

    [StructLayout(LayoutKind.Explicit)]
    public struct Data
    {
        public sbyte charData;
        public short int16Data;
        public int int32Data;

    }
    public Data data;
}

我遇到的问题是当我在测试单页 ios 应用程序中使用生成的 .dll(来自我的绑定项目)时,我收到以下错误

System.AggregateException:发生一个或多个错误。 ---> ObjCRuntime.RuntimeException:注册器无法编组参数'x'的参数类型'SCIGenericType'

我想,我在 C# 代码的某个地方犯了一个错误。我找到了这个关于绑定结构的文档页面https://developer.xamarin.com/api/type/System.Runtime.InteropServices.StructLayoutAttribute/ 但是我没有找到绑定联合的正确方法(我在我的 Objective C 结构定义中拥有的那个)。 有人可以帮我吗?我应该使用 FiledOffset 属性,如果是,那么如何?

【问题讨论】:

  • 你的方法签名是什么样的?通常它是IntPtr,这是受支持的编组类型。
  • 很简单:void AddFunction(SCIGenericType data)
  • void AddFunction(IntPtr data) Xamarin.iOS 有一个固定的类型列表,它将编组并且不提供 custom 编组。 IntPr 将被编组到 ObjC 作为指向您的结构的指针...这当然是不安全的 C# 代码,因此如果您的结构未正确定义,ObjC 将读取/写入托管结构之外的内存
  • 好吧,你成就了我的一天!有用!非常感谢你!我想这应该被标记为答案,所以我可以接受吗?
  • 很高兴它对您有所帮助,我从该评论中做出了回答...

标签: c# ios xamarin struct xamarin.ios


【解决方案1】:

变化:

void AddFunction(SCIGenericType data)

收件人:

void AddFunction(IntPtr data)

Xamarin.iOS 有一个固定的类型列表,它将编组并且不提供自定义编组。

IntPr 将被编组到 Obj-C 作为指向您的结构的指针...

这当然是不安全的 C# 代码,因此如果您的结构未正确定义,Obj-C 将读取/写入托管结构之外的内存。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-14
    • 2012-09-16
    • 1970-01-01
    • 2013-09-07
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多