2015-08-17 8 views
2

Я хотел бы лучше понять отображение структур/классов, когда дело доходит до неуправляемого кода.Создание StructLayout над классом, работающим над структурой

Я определил следующую структуру:

[StructLayout(LayoutKind.Sequential)] 
    public struct ProfileInfo 
    { 
     public int dwSize; 
     public int dwFlags; 
     [MarshalAs(UnmanagedType.LPTStr)] public string lpUserName; 
     [MarshalAs(UnmanagedType.LPTStr)] public string lpProfilePath; 
     [MarshalAs(UnmanagedType.LPTStr)] public string lpDefaultPath; 
     [MarshalAs(UnmanagedType.LPTStr)] public string lpServerName; 
     [MarshalAs(UnmanagedType.LPTStr)] public string lpPolicyPath; 
     public IntPtr hProfile; 

     public ProfileInfo(string userName, string profilepath) 
     { 
     dwFlags = 1;  
     dwSize = Marshal.SizeOf<ProfileInfo>(); 
     lpUserName = userName; 
     lpServerName = null; 
     lpProfilePath = string.IsNullOrWhiteSpace(profilepath) ? null : profilepath; 
     lpPolicyPath = null; 
     lpDefaultPath = null; 
     hProfile = IntPtr.Zero; 
     } 
    } 

для использования с методом падающей:

 [DllImport("userenv.dll", SetLastError = true, CharSet = CharSet.Unicode, EntryPoint = "LoadUserProfileW")] 
     public static extern bool LoadUserProfile(IntPtr hToken, ref ProfileInfo lpProfileInfo); 

Хотя он прекрасно работает до тех пор, как ProfileInfo является структурой, LoadUserProfile начинает сбиваться, когда я сделать ProfileInfo a класс.

Мне просто интересно, почему?
Для меня StructLayout применялся таким же образом над классом или структурой.

Каковы возможные различия в представлении памяти ProfileInfo, которые приводят к сбою LoadUserProfile, когда я меняю его из структуры в класс?

+1

Мой хрустальный шар говорит, что вы забыли удалить 'ref' ключевое слово из декларации аргумента. Требуется, потому что объекты класса всегда передаются по ссылке. Самый лучший способ задать вопрос в SO - это опубликовать код, который * не работает *. –

ответ

-1

В C++ классы содержат скрытый указатель 'this'. Я предполагаю, что C# делает то же самое.

На изображении ниже, pi является структурой, p2 является классом. Вы можете видеть из дампов памяти (pi слева, p2 справа), что p2 имеет некоторые дополнительные байты, которые являются скрытым указателем.

enter image description here

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

  • Нет связанных вопросов^_^