Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 编组包含字符串的结构_C#_C_Interop_Struct_Pinvoke - Fatal编程技术网

C# 编组包含字符串的结构

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

我基本上想从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 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;
}