编组一个包含字符串 [英] marshalling a struct containing string

查看:124
本文介绍了编组一个包含字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我基本上要带参数的名字和字符串年龄用户在C#中,并将其发送给写在C DLL方法,它采取的INT和char [50]在它的参数和返回。我创建了以下情形的字符串,但我失败了,任何机构有code

i basically want to take int name and string age from user in c# and send it to dll method written in c which take int and char[50] arguments in it and return string .i created following scenario but i am failed ,any body has the code

我在C语言开发一个dll其中果酸结构

i have a dll developed in c which ahas a structure

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;

 }

我宣布它在C#中Cs_dll.cs

i declare it in c# in Cs_dll.cs

[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);


    }

现在反对票一个按钮iwant做

now againts a button iwant to do

 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();

        }

但我坚持错误

推荐答案

您需要更改的参数的为



[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct Argument
{
    public int age;

    [MarshalAs(UnmanagedType.LPStr, SizeConst = 50)]
    public string name;
}

- 或 -

- or -



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

您也可以在文章默认封送弦乐的帮助。

You might also find the article Default Marshaling for Strings helpful.

这篇关于编组一个包含字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆