编组包含字符串的结构

我基本上想要从c#中的用户获取int name和string age并将其发送到用c编写的dll方法,其中包含int和char [50]参数并返回字符串.i创建以下场景但我失败了,任何正文都有代码

我有一个用c开发的dll,它有一个结构

struct Argument { int age; char name[50]; } ; 

和方法

 extern "C" { __declspec(dllexport) Argument FillData(Argument data) { Argument mydata; mydata.age=data.age; for(int i=0;i<=sizeof(data);i++) { mydata.name[i]=data.name[i]; } return mydata; } 

我在Cs_dll.cs中的c#中声明它

 [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Ansi)] public struct Argument { public int age; [MarshalAs(UnmanagedType.TBStr)] //public char name; public char[] name; }; public class Cs_Dll { [DllImport("TestLib.dll")] public static extern Argument FillData (Argument data); } 

现在再按一个按钮,我想做

  private void button1_Click(object sender, EventArgs e) { Argument data=new Argument(); data.age=Convert.ToInt32(textBox_age.Text); char[] name={'a','b','r','a','r', ' ', 'a', 'h', 'm', 'e', 'd', '\0' }; for (int i = 0; i <= name.Length; i++) { data.name[i] = name[i]; } // Array.Copy(name, data.name, name.Length); Argument result = Cs_Dll.FillData(data); textBox_get.Text = result.age.ToString(); textBox_age.Text = result.name.ToString(); } 

但我遇到了错误

您需要将Argument的结构定义更改为

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct Argument { public int age; [MarshalAs(UnmanagedType.LPStr, SizeConst = 50)] public string name; }
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct Argument { public int age; [MarshalAs(UnmanagedType.LPStr, SizeConst = 50)] public string name; } 

– 要么 –

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] unsafe public struct Argument { public int age; fixed char name[50]; }
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] unsafe public struct Argument { public int age; fixed char name[50]; } 

您可能还会发现文章Default Marshaling for Strings很有帮助。

在结构中,要编组定义为char []的char数组,您应该使用UnmanagedType.ByValTStr。

 [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] public struct Argument { public int age; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)] public string name; }