使用C#的结构调用C 代码

Calling C++ Code with a struct from C#

本文关键字:代码 调用 结构 使用      更新时间:2023-10-16

i获得了一个第三方库,将未管理的C 代码包装到C#API中,其中一个函数具有一个参数,该参数似乎是本机全局名称空间的struct,我们如何创建C#?

中该结构的实例

这是C 结构:

struct GroupInfo
{
    int                 cMembers;                                           // Current # of members in the group.
    char                saMembers[cMaxMembers][cMaxLoginID + 1];            // Members themselves.
};

当我们尝试在C#中声明其实例时,编译器说Global :: GroupInfo由于其保护级别而无法使用。

C 签名

int QueryGroup(char* sGroupName,
    GroupInfo& gi);

c#签名

VMIManaged.QueryGroup(sbyte*, GroupInfo*)

我有一个名为group info

的课程
class GroupInfo
{
    public int cMembers;
    public sbyte[,] saMembers;
}

,当我尝试使用此代码实现该代码时,我会得到一个无法转换错误

GroupInfo gi = new GroupInfo();
unsafe
{
    sbyte* grpName;
    fixed (byte* p = groupNameBytes)
    { 
        grpName = (sbyte*)p;
    }
    return vmi.QueryGroup(grpName, gi); // cannot convert from class GroupInfo to GroupInfo*
}

您很可能会因groupData类中默认构造函数的默认保护级别而遇到错误。如果它与您尝试使用的文件不同的文件中定义了它,则可以这样定义它:

class GroupInfo
{
  public GroupInfo() {}
  public int cMembers;
  public sbyte saMembers[cMaxMembers][cMaxLoginID + 1];
};