У меня есть задача моделирования следующей структуры в 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;
Союз может быть смоделирован здесь как таковой
[StructLayout(LayoutKind.Explicit)]
struct Union
{
[FieldOffset(0)]
IntPtr hIcon;
[FieldOffset(4)]
IntPtr hMonitor;
}
Это заставило меня задуматься … так как размер IntPtr изменяется с 4 на 32-битной машине и 8 на 64-битной машине, как мне компенсировать это при использовании FieldOffset, учитывая, что в примере показано значение FieldOffset 4 для 32-битной машина?
На самом деле, способ моделировать union
в C # это дать тоже самое FieldOffset
всем членам:
[StructLayout(LayoutKind.Explicit)]
struct Union
{
[FieldOffset(0)]
IntPtr hIcon;
[FieldOffset(0)]
IntPtr hMonitor;
}
Это делает вопрос спорным: не важно, сколько места у каждого IntPtr
занимает, потому что они делятся этим.
Других решений пока нет …