[英]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 指針數組視為字符串數組。 ( iAdapterName和iDisplayName可以被認為是一個由六個字符串組成的數組。)
因此,我傾向於建議您的 C# 結構應該定義字符串數組而不是字符數組。 (但不確定是否需要為MarshalAs屬性的ArraySubType
字段顯式指定UnmanagedType.LPTStr或類似名稱。)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.