簡體   English   中英

將 char*[] 導出到 C#

[英]Export char*[] to C#

我在 C++ 中有一個包含 char*[] 的結構

struct Adapters {
    int iAdapterIndex[6];
    int iBusNumber[6];
    int iDeviceNumber[6];
    char *iAdapterName[6];
    char *iDisplayName[6];
};

extern "C"
{
    __declspec(dllexport) int GET_ADAPTERS_INFO(Adapters* send)
        {    
                .........       

                for (int i = 0; i < 6; i++)
                {
                    if (lpAdapterInfo[i].iBusNumber > -1)
                    {
                        send->iAdapterIndex[i] = lpAdapterInfo[i].iAdapterIndex;
                        send->iBusNumber[i] = lpAdapterInfo[i].iBusNumber;
                        send->iDeviceNumber[i] = lpAdapterInfo[i].iDeviceNumber;
                        send->iAdapterName[i] = lpAdapterInfo[i].strAdapterName;
                        send->iDisplayName[i] = lpAdapterInfo[i].strDisplayName;
                    }
                }        
            return 0;
        }
}

我調用了一個將這個結構傳遞給 C# 的函數

[StructLayout(LayoutKind.Sequential)]
public struct Adapters
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public int[] iAdapterIndex;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public int[] iBusNumber;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public int[] iDeviceNumber;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public char[] iAdapterName;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public char[] iDisplayName;
};

[DllImport("Example.dll", EntryPoint = "GET_ADAPTERS_INFO", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi, ExactSpelling = true, SetLastError = true)]
        public static extern int GET_ADAPTERS_INFO(out Adapters adapters);

但最后我得到了帶有 char* 的數組中的垃圾。 我嘗試了不同的 UnmanagedType 但沒有成功。 該怎么辦?

更新 1:

[StructLayout(LayoutKind.Sequential)]
public struct Adapters
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public int[] iAdapterIndex;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public int[] iBusNumber;
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 6)]
    public int[] iDeviceNumber;
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.LPTStr, SizeConst = 6)]
    public string[] iAdapterName;
    [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.LPTStr, SizeConst = 6)]
    public string[] iDisplayName;
};

這將導致應用程序崩潰

您的 C 結構包含 char指針數組。 字符指針數組不是字符數組。

但是,您的 C# 結構聲明了 char 數組。

因此,您在 C# struct char 數組中看到的“垃圾”實際上是構成 C struct char 指針數組中的指針值的字節,這些字節被編組器解釋為 char 值。

我不完全確定你應該做什么。 但是,請注意以下幾點: 在缺少本機字符串類型的 C 中,字符指針通常用於處理字符串。 您可以將 char 指針數組視為字符串數組。 iAdapterNameiDisplayName可以被認為是一個由六個字符串組成的數組。)

因此,我傾向於建議您的 C# 結構應該定義字符串數組而不是字符數組。 (但不確定是否需要為MarshalAs屬性的ArraySubType字段顯式指定UnmanagedType.LPTStr或類似名稱。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM