对于 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;
这里是.NET Framework 中的托管版本 http://referencesource.microsoft.com/#System/net/System/Net/_OSSOCK.cs,815285a476c6ee34,references:
[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
);