错误:无法封送类型,因为嵌入数组实例的长度与布局中声明的长度不匹配

时间:2012-01-13 03:25:45

标签: c#

我在C#Project中使用COM dll。 我的COM dll中有一个USERINFO结构,如下所示:

struct USERINFO
{
        BYTE UserID[USER_ID_SIZE];//42
        BYTE FirstName[NAME_SIZE];//66
        BYTE LastName[NAME_SIZE]; //66
        long Pin;
        BYTE TimeGroupIDList[IDLIST_SIZE];//10
        enum EUserKind   eUserKind;
        BYTE WarningEye;        
};

当我在C#Application中使用此结构来填充此用户数据结构并传递给我的AddUser API时,它会返回此错误。

感谢任何帮助。 感谢。

2 个答案:

答案 0 :(得分:5)

C#不支持嵌入在结构中的固定长度数组(在不安全的上下文中除外),因此您的C结构可能被编组为C#结构,如下所示:

struct USERINFO
{
    MarshalAs(UnmanagedType.ByValArray, SizeConst = 42)
    BYTE[] UserID;
    MarshalAs(UnmanagedType.ByValArray, SizeConst = 66)
    BYTE[] FirstName;
    // etc.
};

请注意,成员是对数组的引用,而不是嵌入式数组。

为了使编组工作,阵列必须是正确的长度(或者至少是正确的长度,我忘了)。例如,UserID应使用userInfo.UserID = new byte[42];

进行初始化

答案 1 :(得分:0)

我有一个类似的问题,它已经通过为结构添加构造函数来解决:

    struct A
    {
      public A(int b, int c)
      {
        B = b;
        C = c;
      }

      public int B;
      public int C
    }

值得一试!