八、平台调用

本文详细介绍了如何在C#中使用平台调用(P/Invoke)来调用非托管代码,包括如何定义外部方法、映射数据类型以及处理错误。通过示例展示了如何调用Windows API函数CreateHardLink创建硬链接,并强调了在.NET环境中使用平台调用时的最佳实践。同时,提到了在Linux环境下运行的限制以及Windows句柄的安全处理。
摘要由CSDN通过智能技术生成

并不是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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值