gpt4 book ai didi

c# - 使 StructLayout 在类上工作,就像它在结构上工作一样

转载 作者:太空宇宙 更新时间:2023-11-03 17:01:04 28 4
gpt4 key购买 nike

在处理非托管代码时,我想更好地理解结构/类的映射。

我定义了以下结构:

   [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 是一个结构它就可以很好地工作,但是当我将 ProfileInfo 设为一个类时 LoadUserProfile 开始失败。

我只是想知道为什么?
对我来说,StructLayout 以相同的方式应用于类或结构。

当我将 ProfileInfo 的内存表示形式从 struct 更改为 class 时,导致 LoadUserProfile 失败的可能差异是什么?

最佳答案

在 C++ 中,类包含一个隐藏的“this”指针。我猜 C# 做同样的事情。

在下图中,pi 是一个结构体,p2 是一个类。从内存转储(左边是 pi,右边是 p2)可以看出,p2 有一些额外的字节,这是隐藏指针。

enter image description here

关于c# - 使 StructLayout 在类上工作,就像它在结构上工作一样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32054267/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com