使用windows的API或DLL都是互操作性类别。
Windows API 调用属于称为平台调用(或 PInvoke)的互操作性类别。
平台调用大部分类都可以在System.Runtime.InteropServices命名空间找到。在win32文档中显示系统时间的是C函数:
void GetSystemTime(LPSYSTEMTIME lpSystemTime);
参数是指向structure的指针,这个structure的定义是:
typedef struct _SYSTEMTIME
{
WORD wYear;
WORD wMonth;
WORD wDayOfWeek;
WORD wDay;
WORD wHour;
WORD wMinute;
WORD wSecond;
WORD wMilliseconds;
} SYSTEMTIME, *PSYSTEMTIME;
C#语法定义如下:
[StructLayout(LayoutKind.Sequential)] //这一行是类型的信息,和被编译的代码一起存储的元数据
class SystemTime
{
public ushort wYear;
public ushort wMonth;
public ushort wDayOfWeek;
public ushort wDay;
public ushort wHour;
public ushort wMinute;
public ushort wSecond;
public ushort wMilliseconds;
}
StructLayoutAttribute是System.Runtime.InteropServices中的类,可以控制类或结构中字段在内存中的布局,和枚举类型LayoutKind配合使用
LayoutKind.Sequential --按照结构中占用空间最大的成员进行对齐
LayoutKind.Explicit--成员精确位置被显式控制
LayoutKind.Auto--运行库自动为成员选择适当的布局
也要给要调用的win32函数一个声明:
[DllImport("kernel32.dll")]
static extern void GetSystemTime(SystemTime st);
extern关键字的意思是该函数在程序之外,kernel32.dll是该函数所在的动态链接库。
如果把SystemTime定义成structure,则这样写:
static extern void GetSystemTime(out SystemTime st);
out的意思是传给函数的是一个引用,但是无须先初始化这个对象