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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无法将结构从非托管库编组到单触引中的托管代码相关的知识,希望对你有一定的参考价值。

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

  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库中?

答案

您的C#定义不正确。

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

你可以看看这个:

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

以上是关于无法将结构从非托管库编组到单触引中的托管代码的主要内容,如果未能解决你的问题,请参考以下文章

从非托管 c++ 调用 C# 函数(通过托管包装器)

从 c# dll 调用/编组字符串到非托管代码

将具有枚举成员的非托管结构编组到 c#

如何从非托管 C++ 代码获取结构化列表值到 C#?

从非托管 C 库访问 C# 方法是不是安全? [关闭]

在托管代码和非托管代码之间传递非托管结构的安全数组