2009-12-31 2 views
1

Я в основном хочу взять int name и string age из пользователя в C# и отправить его в DLL-метод, написанный с помощью c, который принимает в нем аргументы int и char [50] и возвращает строку .i, созданный по следующей схеме но я потерпел неудачу, любое тело имеет кодmarshalling struct, содержащий строку

я есть длл разработан в с, AHAs структуру

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

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


    } 

Теперь againts кнопочный Iwant сделать

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

     } 

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

ответ

9

Вы должны изменить свое определение структуры из Аргумента к любой

 

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

Вы также можете найти статью Default Marshaling for Strings полезной.

1

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

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

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