背景:
在C#代碼中,需要將一個結構體轉為字符數組的形式
結構的形式類似於:
struct usrInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] name;
public int ID;
}
調用自己的結構體轉換函數,將其轉為字符數組形式
但是提示如下錯誤:傳遞給系統調用的數據區域太小。 (異常來自 HRESULT:0x8007007A)
這里你首先就要檢查你給name賦值是不是超過了16的大小?然后再往下看!
錯誤提示在:Marshal.StructureToPtr(structObj, structPtr, true); 方法處
查錯:
在網上找了一些材料,發現也有一些類似的情況。有一個狀況是:轉換英文的時候不會出錯,但轉換中文會出錯。
測試了一下,果真是這樣的。因為程序需要使用中文名,而是用英文的時候沒有出現該錯誤提示。
錯誤原因:
在結構體布局的時候,沒有指明是unicode碼方式,因此在將結構體傳送到StructToPtr()方法的時候產生了錯誤
解決辦法:
用StructLayOut特性來定義結構體,使其編碼方式采用unicode編碼方式(通過設置CharSet屬性來實現)
修改后結構體定義如下:
[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)]
struct usrInfo
{
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 16)]
public char[] name;
public int ID;
}
