593
Chương 15: Khả năng liên tác mã lệnh không-được-quản-lý
[FieldOffset(4)] public int dwMajorVersion;
[FieldOffset(8)] public int dwMinorVersion;
[FieldOffset(12)] public int dwBuildNumber;
[FieldOffset(16)] public int dwPlatformId;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst=128)]
[FieldOffset(20)] public String szCSDVersion;
}
Sau khi đã định nghĩa cấu trúc được sử dụng bởi hàm
GetVersionEx
, bạn có thể khai báo hàm
này và sử dụng nó. Ứng dụng dưới đây sẽ trình bày toàn bộ mã lệnh cần thiết. Chú ý,
InAttribute
và
OutAttribute
được áp dụng cho
OSVersionInfo
để biết rằng marshalling sẽ
được thực hiện trên cấu trúc này khi nó được truyền cho hàm và khi nó được trả về từ hàm.
Ngoài ra, phương thức
Marshal.SizeOf
được sử dụng để tính kích thước của cấu trúc trong bộ
nhớ.
using System;
using System.Runtime.InteropServices;
public class CallWithStructure {
// (Bỏ qua lớp OSVersionInfo.)
[DllImport("kernel32.dll")]
public static extern bool GetVersionEx([In, Out] OSVersionInfo osvi);
private static void Main() {
OSVersionInfo osvi = new OSVersionInfo();
osvi.dwOSVersionInfoSize = Marshal.SizeOf(osvi);
GetVersionEx(osvi);
Console.WriteLine("Class size: " + osvi.dwOSVersionInfoSize);
Console.WriteLine("Major Version: " + osvi.dwMajorVersion);
Console.WriteLine("Minor Version: " + osvi.dwMinorVersion);
Console.WriteLine("Build Number: " + osvi.dwBuildNumber);
Console.WriteLine("Platform Id: " + osvi.dwPlatformId);
Console.WriteLine("CSD Version: " + osvi.szCSDVersion);
Console.WriteLine("Platform: " + Environment.OSVersion.Platform);
Console.WriteLine( "Version: " + Environment.OSVersion.Version);
Console.ReadLine();
}