C# 是否仅使用引用指针查找对象数组的总大小?

C# 是否仅使用引用指针查找对象数组的总大小?,c#,marshalling,wlanapi,C#,Marshalling,Wlanapi,所以作为一个概述,我正在使用Wlanapi,而且我对它(一般来说是原生API)还相当陌生。我遇到了一个问题,从C++到C语言的结构转换。现在我有: 原件: typedef struct _WLAN_BSS_LIST { DWORD dwTotalSize; DWORD dwNumberOfItems; WLAN_BSS_ENTRY wlanBssEntries[1]; } WLAN_BSS_LIST, *PWLAN_BSS_LIST;

所以作为一个概述,我正在使用Wlanapi,而且我对它(一般来说是原生API)还相当陌生。我遇到了一个问题,从C++到C语言的结构转换。现在我有:

原件:

typedef struct _WLAN_BSS_LIST {
    DWORD          dwTotalSize;
    DWORD          dwNumberOfItems;
    WLAN_BSS_ENTRY wlanBssEntries[1];
} WLAN_BSS_LIST, *PWLAN_BSS_LIST;
转换:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
struct WLAN_BSS_LIST 
{
    internal uint             dwTotalSize;
    internal uint             dwNumberOfItems;
    internal WLAN_BSS_ENTRY[] wlanBssEntries;

    internal WLAN_BSS_LIST(IntPtr ppBssList)
    {
        dwNumberOfItems = (uint)Marshal.ReadInt32(ppBssList);
        //I need to set the value of dwTotalSize but I dunno how
        wlanBssEntries = new WLAN_BSS_ENTRY[dwNumberOfItems];

        for (int i = 0; i < dwNumberOfItems; i++)
        {
            IntPtr pWlanBssEntry = new IntPtr(ppBssList.ToInt32() + i * 
                Marshal.SizeOf(typeof(WLAN_BSS_ENTRY)) + 8);
            wlanBssEntries[i] = (WLAN_BSS_ENTRY)Marshal.
                                    PtrToStructure(pWlanBssEntry, 
                                        typeof(WLAN_BSS_ENTRY));
        }
    }
}
[StructLayout(LayoutKind.Sequential,CharSet=CharSet.Unicode)]
结构WLAN\u BSS\u列表
{
内部单元DWT总尺寸;
内部uint dwNumberOfItems;
内部WLAN_BSS_条目[]WLANBSSenters;
内部WLAN_BSS_列表(IntPtr ppBssList)
{
dwNumberOfItems=(uint)Marshal.ReadInt32(ppBssList);
//我需要设置dwTotalSize的值,但我不知道如何设置
wlanBssEntries=新的WLAN_BSS_条目[dwNumberOfItems];
对于(int i=0;i
我只是不知道如何获得
ppBssList
引用的数组的总大小:(

仅供参考,如果有人指给我一个现有的图书馆,我会非常失望


编辑以添加原始结构

我不确定您的twTotalSize是否反映了为WLANBSSenters中的条目分配的内存量,如果是这样,一个简单的计算就足够了

 sizeof(typeof(WLAN_BSS_ENTRY)) * dwNumberOfItems + 8

否则,我建议您发布原始的本机数据结构,也许有更好的方法从内存块封送它。

所以我想出来了,我不知道我在想什么

[StructLayout(LayoutKind.Sequential, Pack=1)]
struct WLAN_BSS_LIST
{
    internal uint dwTotalSize;
    internal uint dwNumberOfItems;
    internal WLAN_BSS_ENTRY[] wlanBssEntries;

    internal WLAN_BSS_LIST(IntPtr ppBssList)
    {
        dwTotalSize = (uint)Marshal.ReadInt32(ppBssList);
        dwNumberOfItems = (uint)Marshal.ReadInt32(ppBssList, 4);
        wlanBssEntries = new WLAN_BSS_ENTRY[dwNumberOfItems];
        for (int i = 0; i < dwNumberOfItems; i++)
        {
            IntPtr pWlanBssEntry = new IntPtr(ppBssList.ToInt32() + i * 
                Marshal.SizeOf(typeof(WLAN_BSS_ENTRY)) + 8);
            wlanBssEntries[i] = (WLAN_BSS_ENTRY)Marshal.
                PtrToStructure(pWlanBssEntry, typeof(WLAN_BSS_ENTRY));
        }
    }
}

存在一个现有库。因此数组中除了包含的实际项之外没有其他信息?这取决于要封送的本机结构,如果您能够手动封送每个元素,我想您知道自己的结构。我不确定,您需要根据WLAN_BSS_条目结构进行自己的计算
[StructLayout(LayoutKind.Sequential)]
public struct WLAN_BSS_ENTRY
{
    public DOT11_SSID dot11Ssid;
    public uint uPhyId;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public byte[] dot11Bssid;
    public DOT11_BSS_TYPE dot11BssType;
    public DOT11_PHY_TYPE dot11BssPhyType;
    public int lRssi;
    public uint uLinkQuality;
    public bool bInRegDomain;
    public UInt16 usBeaconPeriod;
    public UInt64 ullTimestamp;
    public UInt64 ullHostTimestamp;
    public UInt16 usCapabilityInformation;
    public uint ulChCenterFrequency;
    public WLAN_RATE_SET wlanRateSet;
    public uint ulIeOffset;
    public uint ulIeSize;
}