无法将结构从非托管库编组到单触引中的托管代码

时间:2012-07-09 20:20:25

标签: 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;
    public int iType;
    public int state;
    public byte[] data;
}

我在这里要指出一些事情。我不确定unsigned char数组应该映射到什么。我最初猜测unsigned char应映射到char,但C#中的char是Unicode,所以看起来它不会起作用。我也尝试将它映射到一个字节。我也不知道长度1200对于编组人员是否有意义,如果是,那么如何指定它。

我的monotouch应用程序中有以下方法,它将结构作为参数。

    [Export("OnRecvData:")]
    public void OnRecvData(TCardCmdRespond respond)
    {
        ...
    }

该方法由库通过选择器调用。调用该方法没有问题。当我查看结构中包含的数据时会出现问题。当我期望它们在1-3之间时,这些数字非常高(类似的Objective-c代码显示iType在这个范围内)。我尝试使用位转换器来反转字节顺序,以防它是编组器没有为我解决的字节序问题。数字仍然很高所以我认为问题不仅仅是简单的字节顺序。

当我尝试从char数组中提取数据时,会出现更多问题。它不是null但是尝试以空检查之外的任何方式访问它会使应用程序崩溃EXC_BAD_ACCESS(SIGABRT)

我的解决方法是在objective-c中为此编写一个包装器,将结构分解为参数。然后创建一个包装它的库并将其绑定。我的客观技能不是很热,但这是一个缓慢的过程。

有没有办法让我可以完成这项工作,而无需将其包装在Objective-c库中?

1 个答案:

答案 0 :(得分:2)

您的C#定义不正确。

C版本包含一个1200字节的内联块,而C#版本包含一个指向数组的指针(4个字节)。

你可以看一下:

http://msdn.microsoft.com/en-us/library/z6cfh6e6.aspx