簡體   English   中英

元帥char [] [LENGTH] in c#

[英]Marshal char[][LENGTH] in c#

在C#項目中,我很難連接來自外部庫的C ++函數。 我猜這是字符串編組的問題。

在C ++中,具有以下功能:

int compute(const char names[][LENGTH_1], char values[][LENGTH_2], const int n);

目標是提供:

  • 包含“ n”個LENGTH_1個字符的字符串的只讀數組
  • 包含LENGTH_2個字符的“ n”個字符串的可寫數組

函數“計算”將根據“名稱”中指定的內容寫入數組“值”。

在C#中嘗試了兩種不同的方法來連接函數

方法1

[DllImport("abcd.dll", EntryPoint="compute", CharSet=CharSet.Ansi)]
internal static extern int Compute(StringBuilder [] names, StringBuilder [] values, int n);

我這樣稱呼它:

var names = new StringBuilder[number];
var descriptions = new StringBuilder[number];
for (int i = 0; i < number; i++) {
  names[i] = new StringBuilder(LENGTH_1);
  descriptions[i] = new StringBuilder(LENGTH_2);
}
var error = Compute(names, descriptions, number);

方法2

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=4)]
internal struct StringName
{
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=64)] // LENGTH_1 = 64
  public string msg;
}

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi, Pack=4)]
internal struct StringValue
{
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)] // LENGTH_2 = 128
  public string msg;
}

[DllImport("abcd.dll", EntryPoint="compute", CharSet=CharSet.Ansi)]
internal static extern int Compute(StringName[] names, ref StringValue[] values, int number);

我這樣稱呼它:

var names = new StringNames[number];
var values = new StringValue[number];
var error = Compute(names, ref values, number);

結果

它崩潰無一例外,該程序在“計算”功能上被阻止。 我仍然不確定問題是來自字符串還是來自外部庫。

大衛發現,關鍵字“ ref”是錯誤的。 這是方法2的更改。

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
internal struct StringName
{
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=LENGTH_1)]
  public string msg;
}

[StructLayout(LayoutKind.Sequential, CharSet=CharSet.Ansi)]
internal struct StringValue
{
  [MarshalAs(UnmanagedType.ByValTStr, SizeConst=LENGTH_2)]
  public string msg;
}

[DllImport("abcd.dll", EntryPoint="compute", CharSet=CharSet.Ansi)]
internal static extern int Compute([In] StringName[] names, [In, Out] StringValue[] values, int number);

我這樣稱呼它:

var names = new StringNames[number];
// ... here the initialization of "names" ... //
var values = new StringValue[number];
var error = Compute(names, values, number);
// ... here the processing of "values" ... //

暫無
暫無

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

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