C#平台调用教程:使用非托管DLL函数

需积分: 14 44 下载量 65 浏览量 更新于2024-08-05 收藏 97.07MB PDF 举报
"C#高级编程·(第7版)-C#平台调用技术详解" 在.NET Framework中,有时我们需要调用非托管代码,比如Windows API,来利用一些.NET不直接支持的功能。平台调用(Platform Invoke,简称P/Invoke)服务就是为此而设计的。在标题提到的"hta8533-md-007yy_使用说明书_v1.1_20170302"文档中,讨论了如何在C#中使用平台调用来调用Windows API函数,如`CreateHardLink`。 平台调用允许.NET应用直接与非托管DLL进行交互,这些DLL可能包含了操作系统提供的关键功能。例如,`CreateHardLink`函数在`kernel32.dll`中,用于创建文件的硬链接。由于.NET Framework 4可能不直接提供此功能,所以需要通过P/Invoke来实现。 使用平台调用的步骤大致如下: 1. **查找函数**:首先,你需要知道要调用的非托管函数名。可以使用工具如`dumpbin`,通过`/exports`选项列出DLL中的导出函数,例如`dumpbin /exports c:\windows\system32\kernel32.dll | more`。 2. **定义托管方法**:在C#中,需要定义一个带有`DllImport`属性的方法,该方法表示非托管函数。参数数量和类型需要与非托管函数匹配。例如,对于`CreateHardLink`函数,其定义如下: ```csharp [DllImport("kernel32.dll", SetLastError = true)] static extern bool CreateHardLink( [MarshalAs(UnmanagedType.LPTStr)] string lpFileName, [MarshalAs(UnmanagedType.LPTStr)] string lpExistingFileName, IntPtr lpSecurityAttributes); ``` 这里,`DllImport`指明了函数所在的DLL,`SetLastError = true`表示调用后可以检查错误代码,`UnmanagedType`则用于指定托管类型与非托管类型之间的映射。 3. **调用函数**:在C#代码中,像调用普通.NET方法一样调用这个静态外部方法即可。 在实际开发中,平台调用可能会涉及到更复杂的类型转换和错误处理,例如,某些API可能需要处理`IntPtr`或`HandleRef`类型,或者需要处理结构体和枚举类型。因此,理解非托管API的工作原理和正确映射类型是至关重要的。 在《C#高级编程》(第7版)这本书中,详细讲解了C#的高级特性,包括平台调用在内的系统级编程技术,可以帮助开发者深入理解如何在.NET环境中有效地使用非托管资源。通过学习,开发者可以更好地利用C#进行复杂系统的开发和维护,同时确保代码的稳定性和性能。