在处理非托管代码时,我想更好地理解结构/类的映射。
我定义了以下结构:
[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
我只是想知道为什么?
对我来说,StructLayout 以相同的方式应用于类或结构。
当我将其从 struct 更改为 class 时,导致 LoadUserProfile 失败的 ProfileInfo 内存表示的可能差异是什么?