C#的互操作性

时间:2022-09-10 22:09:55

使用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的意思是传给函数的是一个引用,但是无须先初始化这个对象