xamarin的.ios binding objective-c union |编组自定义类型

本文关键字:自定义 类型 union ios binding objective-c xamarin | 更新日期: 2023-09-27 18:17:14

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

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

下面是我的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;
}

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

系统。AggregateException:发生了一个或多个错误。——> ObjCRuntime。RuntimeException:注册商无法封送参数"x"的参数类型"SCIGenericType"

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

xamarin的.ios binding objective-c union |编组自定义类型

变化:

void AddFunction(SCIGenericType data)

:

void AddFunction(IntPtr data)

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

IntPr将被封送到Obj-C作为指向你的结构的指针…

这当然是不安全的c#代码,所以如果你的结构没有正确定义,Obj-C将在你的托管结构之外读取/写入内存。