2

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

我定义了以下结构:

   [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 内存表示的可能差异是什么?

4

1 回答 1

-1

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

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

在此处输入图像描述

于 2015-08-17T15:47:58.033 回答