【发布时间】: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