非托管结构体中定义固定大小的数组问题
假设某个API需要用到某个结构,而那个结构中包含一个固定大小的数组,如:
typedef struct _IMAGE_OPTIONAL_HEADER {
//
// Standard fields.
//
WORD Magic;
BYTE MajorLinkerVersion;
BYTE MinorLinkerVersion;
DWORD SizeOfCode;
DWORD SizeOfInitializedData;
DWORD SizeOfUninitializedData;
DWORD AddressOfEntryPoint;
DWORD BaseOfCode;
DWORD BaseOfData;
//
// NT additional fields.
//
DWORD ImageBase;
DWORD SectionAlignment;
DWORD FileAlignment;
WORD MajorOperatingSystemVersion;
WORD MinorOperatingSystemVersion;
WORD MajorImageVersion;
WORD MinorImageVersion;
WORD MajorSubsystemVersion;
WORD MinorSubsystemVersion;
DWORD Win32VersionValue;
DWORD SizeOfImage;
DWORD SizeOfHeaders;
DWORD CheckSum;
WORD Subsystem;
WORD DllCharacteristics;
DWORD SizeOfStackReserve;
DWORD SizeOfStackCommit;
DWORD SizeOfHeapReserve;
DWORD SizeOfHeapCommit;
DWORD LoaderFlags;
DWORD NumberOfRvaAndSizes;
IMAGE_DATA_DIRECTORY DataDirectory[IMAGE_NUMBEROF_DIRECTORY_ENTRIES];
} IMAGE_OPTIONAL_HEADER32, *PIMAGE_OPTIONAL_HEADER32;
我要写C#中对应的代码该如何呢?
[StructLayout(LayoutKind.Sequential)]
public struct ImageOptionalHeader
{
//Standard Field.
UInt16 Magic;
Byte MajorLinkerVersion;
Byte MinorLinkerVersion;
UInt32 SizeOfCode;
UInt32 SizeOfInitializedData;
UInt32 SizeOfUninitializedData;
UInt32 AddressOfEntryPoint;
UInt32 BaseOfCode;
UInt32 BaseOfData;
//NT Additional fields
UInt32 ImageBase;
UInt32 SectionAlignment;
UInt32 FileAlignment;
UInt16 MajorOperatingSystemVersion;
UInt16 MinorOperatingSystemVersion;
UInt16 MajorImageVersion;
UInt16 MinorImageVersion;
UInt16 MajorSubsystemVersion;
UInt16 MinorSubsystemVersion;
UInt32 Win32VersionValue;
UInt32 SizeOfImage;
UInt32 SizeOfHeaders;
UInt32 CheckSum;
UInt16 Sybsystem;
UInt16 DllCharacteristics;
UInt32 SizeOfStackReserve;
UInt32 SizeOfStackCommit;
UInt32 SizeOfHeapReserve;
UInt32 SizeOfHeapCommit;
UInt32 LoaderFlags;
UInt32 NumberOfRvaAndSizes;
[ MarshalAs( UnmanagedType.ByValArray, SizeConst=16,ArraySubType=UnmanagedType.Struct )]
ImageDataDirectory[] DataDirectory;
}
能通过编译但是无法通过sizeof获取大小。说这个是托管类型。而没有定义数组的结构却可以通过sizeof获取大小。
怎么能修改这个ImageOptionalHeader让他能通过sizeof获取正确的大小呢?