C# 编组包含字符串的结构
我基本上想从c#中的用户那里获取int name和string age,并将其发送到用c编写的dll方法,该方法在其中获取int和char[50]参数并返回字符串 我有一个用c开发的dll,它是一个结构C# 编组包含字符串的结构,c#,c,interop,struct,pinvoke,C#,C,Interop,Struct,Pinvoke,我基本上想从c#中的用户那里获取int name和string age,并将其发送到用c编写的dll方法,该方法在其中获取int和char[50]参数并返回字符串 我有一个用c开发的dll,它是一个结构 struct Argument { int age; char name[50]; } ; 和一种方法 extern "C" { __declspec(dllexport) Argument FillData(Argument data) { Argument my
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;
}
现在我又想按一个按钮
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();
}
private void按钮1\u单击(对象发送者,事件参数e)
{
参数数据=新参数();
data.age=Convert.ToInt32(textBox\u age.Text);
char[]name={'a','b','r','a','r','a','h','m','e','d','0'};
对于(inti=0;i您需要将参数的结构定义更改为
[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];
}
您可能也会发现这篇文章很有帮助。在结构中,要封送定义为char[]的char数组,您应该改用UnmanagedType.ByValTStr
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Argument
{
public int age;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string name;
}
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Argument
{
public int age;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
public string name;
}