маршалинг структуры, содержащей строку

я в основном хочу взять имя int и возраст строки от пользователя в С# и отправить его методу dll, написанному на c, который принимает в нем аргументы int и char [50] и возвращает строку. Я создал следующий сценарий, но я потерпел неудачу, любое тело имеет код

у меня есть dll, разработанная на c, которая имеет структуру

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

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

        }

но я застрял с ошибкой


person abrar    schedule 31.12.2009    source источник


Ответы (2)


Вам нужно изменить определение структуры Argument либо на


[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];
}

Вам также может быть полезна статья Маршалинг строк по умолчанию.

person Hasani Blackwell    schedule 31.12.2009

Внутри структуры для маршалирования массивов символов, определенных как char[], вместо этого следует использовать UnmanagedType.ByValTStr.

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

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 50)]
    public string name;
}
person Droxx    schedule 24.10.2017