2

我在供应商提供给我们的库的头文件中定义了以下结构。

  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 数组中提取数据时,会出现更多问题。它不是空值,但尝试以空值检查之外的任何方式访问它会使应用程序崩溃,并带有 EXC_BAD_ACCESS (SIGABRT)

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

有没有一种方法可以让我完成这项工作,而不必将其包装在一个 Objective-C 库中?

4

1 回答 1

2

您的 C# 定义不正确。

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

你可以看看这个:

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

于 2012-07-11T21:17:50.337 回答