并不是Windows API调用的所有特性都可用于.NET。旧的Windows API调用是这样,新功能也是这样。也许开发人员会编写一些DLL,导出非托管的方法,在C#中使用它们。
要重用一个非托管库,其中不包含COM对象,只包含导出的功能,就可以使用平台调用(P/Invoke)。有了P/Invoke,CLR会加载DLL,其中包含应调用的函数,并编组参数。
要使用非托管函数,首先必须确定导出的函数名。为此,可以使用dumpbin工具和/exports选项。例如,命令:
dumpbin /exports c:\windows\system32\kernel32.dll | more
列出DLL kernel32.dll中所有导出的函数。这个示例使用Windows API函数CreateHardLink来创建到现有文件的硬连接。使用此API调用,可以用几个文件名引用相同的文件,只要文件名在一个硬盘上即可。这个API调用不能用于.NET Core,因此必须使用平台调用。
为了调用本机函数,必须定义一个参数数量相同的C#外部方法,用非托管方法定义的参数类型必须用托管代码映射类型。
在C++中,Windows API调用CreateHardLink有如下定义:
BOOL CreateHardLink(
LPCTSTR lpFileName,
LPCTSTR lpExistingFileName,
LPSECURITY_ATTRIBUTES lpSecurityAttributes);
这个定义必须映射到.NET数据类型上。非托管代码的返回类型是BOOL;它仅映射到bo