ios - 无法将结构从非托管库编码为单触摸中的托管代码

标签 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 对编码(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 字节)。

你可以看看这个:

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

关于ios - 无法将结构从非托管库编码为单触摸中的托管代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11402494/

相关文章:

iphone - 将 ZeroMQ 交叉编译到 ARM 以用于 MonoTouch iPhone 应用程序配置设置

c# - 将 StackPanel 子项绑定(bind)到 ObservableCollection

wpf - 如何将 DataTable 设置为 DataGridComboBoxColum 的 ItemsSource?

.net - Monotouch命令行构建不起作用

ios - Obj-C 检查图像是否已存在于照片库中

OpenWrt 的 Python Evdev 绑定(bind)

Xamarin:使用具有 UICompletion 处理程序的 Notify 方法不可用

iphone - 现在的 Modal ViewController 可以被认为是 ios 应用程序中弹出窗口的一种方式吗?

ios - 将 "iCloud"权限添加到您的应用程序 ID

ios - 使用 iOS 6 的 iPhone 应用程序中的嵌入式 vimeo 视频无法播放