簡體   English   中英

C#如何在結構中使用結構數組P /調用?

[英]C# How to P/Invoke with struct array in struct?

在C#中,如何使用struct中的struct數組P / Invoke?

C Lang定義的struct如下...

struct 'OuterStruct'
  int outerId
  InnerStruct[10] innerStruct 
struct 'InnerStruct'
  int innerId
  char[32] name

而C Lang定義的Function是:

int ClangFunc(OuterStruct* arg)

“ ClangFunc”設置為“ arg”。

我從C#叫'ClangFunc'...

[DllImport("makefromclang.dll", EntryPoint="ClangFunc")]
public static extern int ClangFunc(IntPtr arg);

[StructLayout(LayoutKind.Sequential)]
public struct OuterStruct
{
    public int outerId;
    [MarshalAs(UnmanagementType.ByValArray, SizeConst=10)]
    public InnerStuct[] innerStruct;
}

[StructLayout(LayoutKind.Sequential)]
public struct InnerStruct
{
    public int innerId;
    [MarshalAs(UnmanagementType.ByValTStr, SizeConst=32)]
    public string name;
}

/* caller */
OuterStruct outerStruct = new OuterStruct();
IntPtr ptr = Marshal.AllocCoTaskMem(Marshal.SizeOf(outerStruct));
Marshal.StructureToPtr(outerStruct, ptr, false);
int result = ClangFunc(ptr);
OuterStruct resultStruct = (OuterStruct)Marshal.PtrToStructure(ptr, typeof(OuterStruct));

調用ClangFunc成功。

OuterStruct.outerId and OuterStruct.innerStruct[0].innerId結果設置為收集值。(在以上resultStruct值中)

但是OuterStruct.innerStruct[0].namenull ,為什么?

我期望使用“”(空字符串)或任何Shift_JIS字符串。 無法設置null值。

謝謝大家

問題是在char []中設置的值是Shift_JIS字符集。 .NET將char []轉換為字符串時,它不考慮字符集。 結果,字符串值被破壞,調試器似乎具有空字符串值。

為了解決此問題,我將映射到該結構的字符串修改為byte []並將byte []轉換為字符串。

// [MarshalAs(UnmanagementType.ByValTStr, SizeConst=32)]
// public string name;
[MarshalAs(UnmanagedType.ByValArray, ArraySubType=UnmanagedType.ByValTStr, SizeConst=32)]
public byte[] name;


string str = System.Text.Encoding.GetEncoding("Shift_JIS").GetString(name);

暫無
暫無

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

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