我在供应商提供给我们的库的头文件中定义了以下结构。
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 对编码(marshal)拆收器是否重要,如果重要,如何指定它。
我的单触摸应用程序中有以下方法,该方法将结构作为参数。
[Export("OnRecvData:")]
public void OnRecvData(TCardCmdRespond respond)
{
...
}
该方法由库通过选择器调用。调用该方法没有问题。当我查看结构中包含的数据时,问题就出现了。当我期望它们在 1-3 之间的范围内时,数字非常高(类似的 Objective-C 代码显示 iType 在此范围内)。我尝试使用位转换器来反转字节顺序,以防编码(marshal)拆收器没有为我解决字节顺序问题。数字仍然很高,因此我认为问题超出了简单的字节顺序。
当我尝试从 char 数组中提取数据时,出现了更多问题。它不为空,但尝试以除空检查之外的任何方式访问它都会导致应用程序崩溃,并显示 EXC_BAD_ACCESS (SIGABRT)
我的解决方案是在 Objective-C 中为此编写一个包装器,将结构分解为参数。然后创建一个库来包装它并绑定(bind)它。我的 Objective-C 技能并不是那么出色,而且这是一个缓慢的过程。
有没有一种方法可以让我完成这项工作,而不必将其包装在 Objective-C 库中?
最佳答案
您的 C# 定义不正确。
C 版本包含一个 1200 字节的数组内联 block ,而 C# 版本包含一个指向数组的指针(4 字节)。
你可以看看这个:
关于ios - 无法将结构从非托管库编码为单触摸中的托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11402494/