2014-01-12 2 views
2

У меня проблема с строкой фиксированного размера в struct и get/set методами привязки данных.Исправлен размер строки get/set

Моя структура:

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
struct MyStruct 
{ 
    public int Var1 { get; set; } 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
    public string Var2; 
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)] 
    public string Var3; 
    public int Var4 { get; set; } 
}; 

Когда я набор {получить; набор} для Переменная2 и var3 я получаю ошибку:

error CS0592: Attribute 'MarshalAs' is not valid on this declaration type. It is only valid on 'field, param, return' declarations.

Как мне сделать набор/получить методы переменная2/var3 и не изменить размер структуры?

+0

У кого-то есть другие варианты? – user3000633

ответ

3

Проблема в том, что string является типом C# и не может быть сопоставлен с типом C. Попробуйте вручную объединить строки как char[] s и преобразовать их в строки в C# (без маршалинга). Вам также нужно будет изменить MarshalAs, чтобы представить, что вы будете маршировать массивы, а не строки.

[StructLayout(LayoutKind.Sequential, Pack = 1)] 
struct MyStruct 
{ 
    public int Var1 { get; set; } 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] 
    private char[] _Var2; 
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] 
    private char[] _Var3; 
    public int Var4 { get; set; } 

    public string Var2 { 
     get { 
      return new string(_var2); 
     } 
     set { 
      this._var2 = value.ToCharArray(); 
     } 
    } 
    public string Var3 { 
     get { 
      return new string(_var3); 
     } 
     set { 
      this._var3 = value.ToCharArray(); 
     } 
    } 
}; 
+0

его размер изменения не изменяется? – user3000633

+0

Я забыл обратиться к части размера структуры; вы можете поместить некоторую логику в сеттерах, чтобы обрезать входную строку 'string' до 32 символов или добавить пробелы, чтобы развернуть до 32 символов, прежде чем записывать значения в' char [] 's. – Tenner

+0

«Проблема в том, что строка - это тип C#», например, no bcz i make char [] Var2/Var3, и я получаю такую ​​же ошибку (я имею в виду, используя get/set) – user3000633

Смежные вопросы