c# - 在 C# 中建模 C/C++ union

标签 c# c++ pinvoke 32bit-64bit unions

我的任务是在 C# 中对以下结构进行建模:

typedef struct _SHELLEXECUTEINFO {
  DWORD     cbSize;
  ULONG     fMask;
  HWND      hwnd;
  LPCTSTR   lpVerb;
  LPCTSTR   lpFile;
  LPCTSTR   lpParameters;
  LPCTSTR   lpDirectory;
  int       nShow;
  HINSTANCE hInstApp;
  LPVOID    lpIDList;
  LPCTSTR   lpClass;
  HKEY      hkeyClass;
  DWORD     dwHotKey;
  union {
    HANDLE hIcon;
    HANDLE hMonitor;
  } DUMMYUNIONNAME;
  HANDLE    hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;

union 可以在这里建模

[StructLayout(LayoutKind.Explicit)]
struct Union
{
    [FieldOffset(0)]
    IntPtr hIcon;

    [FieldOffset(4)]
    IntPtr hMonitor;
}

这让我开始思考......由于 IntPtr 的大小在 32 位机器上从 4 变为 64 位机器上的 8,我如何在使用 FieldOffset 时对此进行补偿,假设该示例显示 FieldOffset 为 4,对于 32 位机器?

最佳答案

实际上,the way to model a union在 C# 中是为所有成员提供相同的 FieldOffset:

[StructLayout(LayoutKind.Explicit)]
struct Union
{
    [FieldOffset(0)]
    IntPtr hIcon;

    [FieldOffset(0)]
    IntPtr hMonitor;
}

这使问题变得毫无意义:每个 IntPtr 占用多少空间并不重要,因为它们正在共享它。

关于c# - 在 C# 中建模 C/C++ union ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14674050/

相关文章:

c++ - 非标准 gnu 案例范围的标准替代方案

c# - 带有 std::string 的 PInvoke 自定义编码(marshal)拆收器

c# - 如何编写为模板化基指定类型参数的派生类

javascript - 二月份的表单验证

c# - 动态创建 CAML 查询

C# PInvoke 通过 Win32 API 获取文件和文件夹的 ACL

.net - 将非空终止字符串传递给非托管代码

C# 从泛型基类中的字段反射 GetValue

c++ - 是否可以使用 new 运算符在 C++ 11 中初始化数组

c++ - 访问冲突写入位置 0xcccccccc