Я хотел бы лучше понять отображение структур/классов, когда дело доходит до неуправляемого кода.Создание 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, когда я меняю его из структуры в класс?
Мой хрустальный шар говорит, что вы забыли удалить 'ref' ключевое слово из декларации аргумента. Требуется, потому что объекты класса всегда передаются по ссылке. Самый лучший способ задать вопрос в SO - это опубликовать код, который * не работает *. –