Ios Can';t在monotouch中将结构从非托管库封送到托管代码
我在供应商提供给我们的库的头文件中定义了以下结构Ios Can';t在monotouch中将结构从非托管库封送到托管代码,ios,binding,xamarin.ios,static-libraries,Ios,Binding,Xamarin.ios,Static Libraries,我在供应商提供给我们的库的头文件中定义了以下结构 typedef struct { int iLen; int iType; int state; unsigned char data[1200]; } TCardCmdRespond; 我用C#创建了一个我认为与之匹配的结构 [StructLayout(LayoutKind.Sequential)] public struct TCardCmdRespond { public int iLen;
typedef struct {
int iLen;
int iType;
int state;
unsigned char data[1200];
} TCardCmdRespond;
我用C#创建了一个我认为与之匹配的结构
[StructLayout(LayoutKind.Sequential)]
public struct TCardCmdRespond
{
public int iLen;
public int iType;
public int state;
public byte[] data;
}
我有几件事要指出。我不确定无符号字符数组应该映射到什么。我最初猜测,无符号字符应该映射到字符,但C#中的字符是Unicode,所以这似乎不起作用。我还尝试将它映射到一个字节。我也不知道长度1200对封送员是否有意义,如果有,如何指定它
在我的monotouch应用程序中,我采用了以下方法,将结构作为参数
[Export("OnRecvData:")]
public void OnRecvData(TCardCmdRespond respond)
{
...
}
该方法由库通过选择器调用。调用该方法时不会出现问题。当我查看结构中包含的数据时,问题就出现了。当我预计数字在1-3之间时,数字非常高(可比较的objective-c代码显示iType在这个范围内)。我曾尝试使用位转换器来反转字节顺序,以防封送处理程序没有为我解决端部问题。数字仍然很高,所以我认为问题不仅仅在于简单的终结
当我试图从char数组中提取数据时,会出现进一步的问题。它不是空的,但尝试以空检查以外的任何方式访问它会导致应用程序使用EXC_BAD_访问(SIGABRT)崩溃
我的解决方案是在objective-c中为此编写一个包装器,将结构分解为参数。然后创建一个库,将其打包并绑定。我的objective-c技能不是那么热门,但这是一个缓慢的过程
有没有一种方法可以让我不必将其封装在objective-c库中就可以完成这项工作?您的c#定义不正确
C版本包含一个1200字节的数组内联块,而C版本包含一个指向数组(4字节)的指针
你可以看看这个:
@migueldeicaza感谢您的回复。这是我的一个重大疏忽。我会试试看,看能不能解决这个问题。我当然希望它能解决访问问题。你认为这也会修正不正确的整数吗?无论如何,我离解决方案更近了,谢谢你的帮助。