对于 64 位应用程序,.NET Framework 版本和 WSAData 结构的本机 Win32 版本之间存在不匹配,因为字段的顺序不同。我复制了 .NET 版本以用于我们基于 C# 的产品,一位同事担心我导致了内存损坏。使用 DllImport / PInvoke 时是否存在由于这种不匹配而导致内存损坏的风险?将本机版本编组到托管版本时是否存在无效内存访问的风险?假设我不关心实际访问生成的 WSAData 对象的字段。我只是想确定我对 WSAStartup 的调用不会破坏内存或使应用程序崩溃。
这是 WinSock2.h 中的本机 C++ 版本。请注意,成员的顺序在 64 位和 32 位中是不同的。WSADESCRIPTION_LEN 为 256,WSASYS_STATUS_LEN 为 128。
typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
#ifdef _WIN64
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
#else
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYS_STATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
#endif
} WSADATA, FAR * LPWSADATA;
[StructLayout(LayoutKind.Sequential)]
internal struct WSAData {
internal short wVersion;
internal short wHighVersion;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=257)]
internal string szDescription;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=129)]
internal string szSystemStatus;
internal short iMaxSockets;
internal short iMaxUdpDg;
internal IntPtr lpVendorInfo;
}
[DllImport(WS2_32, CharSet=CharSet.Ansi, BestFitMapping=false,
ThrowOnUnmappableChar=true, SetLastError=true)]
internal static extern SocketError WSAStartup(
[In] short wVersionRequested,
[Out] out WSAData lpWSAData
);