在C ++ / CLI中访问托管类成员数组变量

时间:2015-10-05 03:20:51

标签: c# .net c++-cli

由于P / Invoke不支持返回动态大小的数组(你必须在编译时静态指定数组的大小),我决定为.net应用程序中需要的一些函数编写C ++ / CLI包装器。否则用C#编写。

从IpHlpApi.dll获取GetTcpTable2函数... 我创建了C#类来匹配该函数中的类型,如下所示:

public class MibTcpTable2
{
    public int NumEntries;
    public MibTcpRow2[] Table;
}

public class MibTcpRow2
{
    public int State;
    public int LocalAddr;
    public int LocalPort;
    public int RemoteAddr;
    public int RemotePort;
    public int OwningPid;
    public int OffloadState;
}

在我的C ++ / CLI程序中,我调用GetTcpTable2,如MSDN示例所示,然后遍历生成的数组并将其输出分配给我在C#中创建的TcpTable2类的新实例。 见代码:

PMIB_TCPTABLE2 pTcpTable;
ULONG ulSize = 0;
DWORD dwRetVal = 0;

pTcpTable = (MIB_TCPTABLE2 *)MALLOC(sizeof(MIB_TCPTABLE2));
if (pTcpTable == NULL) {
    return nullptr;
}

ulSize = sizeof(MIB_TCPTABLE);
if ((dwRetVal =  ::GetTcpTable2(pTcpTable, &ulSize, TRUE)) == ERROR_INSUFFICIENT_BUFFER)
{
    FREE(pTcpTable);
    pTcpTable = (MIB_TCPTABLE2 *)MALLOC(ulSize);
    if (pTcpTable == NULL) {
        return nullptr;
    }
}

NetClasses::MibTcpTable2^ managedTable = gcnew NetClasses::MibTcpTable2();
managedTable->Table = gcnew cli::array<NetClasses::MibTcpRow2^>(pTcpTable->dwNumEntries);

if ((dwRetVal = ::GetTcpTable2(pTcpTable, &ulSize, TRUE)) == NO_ERROR)
{
    for (int i = 0; i < pTcpTable->dwNumEntries; i++)
    {
        managedTable->Table[i].LocalAddr = pTcpTable->table[i].dwLocalAddr;
        managedTable->Table[i].LocalPort = pTcpTable->table[i].dwLocalPort;
        managedTable->Table[i].OffloadState = pTcpTable->table[i].dwOffloadState;
        managedTable->Table[i].OwningPid = pTcpTable->table[i].dwOwningPid;
        managedTable->Table[i].RemoteAddr = pTcpTable->table[i].dwRemoteAddr;
        managedTable->Table[i].RemotePort = pTcpTable->table[i].dwRemotePort;
        managedTable->Table[i].State = pTcpTable->table[i].dwState;
    }
}

但是,Visual Studio 2015讨厌在for循环中访问managedTable。它抱怨&#34;表达式必须具有类类型。&#34;好的,这通常意味着您使用了错误的数据访问器操作符,所以我尝试了一个点。没有骰子。

我如何访问managedTable的Table成员?在for循环之前对它的访问是有效的。为什么它在for循环中没有效果?

1 个答案:

答案 0 :(得分:2)

您的阵列访问权限为您提供了托管对象的句柄,因此您的字段访问权限也不应该是 - &gt;而不是 。 ?

数组[Ⅰ] - &GT;现场