更新:2007 年 11 月
本示例演示了调用从非托管库中导出的函数的技术。它展示了如何:
- 声明不同的类型 
- 使用可用属性修改默认行为 
- 使用 Marshal 类型的方法 
- 确定垃圾回收和线程处理的哪些方面会影响结果。 
有些示例使用从 Windows 库中导出的函数,而有些示例使用从自定义库中导出的函数。某些示例使用在所有 Windows 平台上都不可用的库,或以所有 Windows 平台都不支持的方法使用函数。但是,这并不妨碍您理解示例中使用的特定平台调用规则。
这些示例包含以下目录结构:
| 目录 | 内容 | 
|---|---|
| WinAPIs | 使用从 Windows 库中导出的函数演示的平台调用 | 
| WinAPIs\CS | 用 C# 编写的源代码 | 
| WinAPIs\VB | 用 Visual Basic 编写的源代码 | 
| Custom | 使用从自定义类型库中导出的函数说明的平台调用。 | 
| Custom\CS | 用 C# 编写的源代码 | 
| Custom\LIB | 自定义类型库源代码 | 
| Custom\VB | 用 VB 编写的源代码 | 
有关使用这些示例的信息,请参见下面的主题:
使用命令提示生成示例
- 打开命令提示窗口,然后定位到语言特定子目录之一。 
- 在命令行上键入 msbuild [文件名].sln。 .gif) 说明: 说明:- Custom 平台调用示例只能使用 Visual Studio 生成。 
使用 Visual Studio 生成示例
- 打开 Windows 资源管理器,然后定位到语言特定子目录之一。 
- 双击 [文件名].sln 的图标以在 Visual Studio 中打开该文件。 
- 在“生成”菜单中选择“生成解决方案”。 
运行示例
- 定位到 WinAPIs 或 Custom 目录下包含生成的可执行文件的语言特定目录之一。 
- 在命令行上键入可执行文件的名称。 .gif) 说明: 说明:- 此示例生成控制台应用程序。您必须在命令提示窗口中分别启动它们才能查看它们的输出。 
要求
如果您使用 Microsoft Visual Studio 2005(“Visual Studio 2005 命令提示符”)进行生成,或者已在包含路径中安装并指定了 Platform SDK,则这些示例需要可用于您的项目的 Windows 头文件。
备注
下面各表汇总了这些示例所演示的主题,并列出与该主题相关的一个或多个示例的源文件的位置。
如何使用平台调用属性
| 属性 | 说明 | 示例 | 
|---|---|---|
| EntryPoint | 重命名函数以在托管代码中使用。 | WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb | 
| CharSet | 选择封送字符串的方式;它还影响函数名搜索条件。 | WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb | 
| ExactSpelling | 指出是否应修改非托管 DLL 中入口点的名称以便与 CharSet 值相对应。 | WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb | 
| CallingConvention | 以 varargs 来调用函数。 | WinAPIs\CS\Printf.cs WinAPIs\VB\Printf.vb | 
| PreserveSig | 修改返回 HRESULT 的函数。 | WinAPIs\CS\CreateObject.cs WinAPIs\VB\CreateObject.vb | 
| SetLastError | 确保在函数调用后保存错误代码。 | WinAPIs\CS\Errors.cs WinAPIs\VB\Errors.vb | 
如何封送结构和联合
| 类型 | 说明 | 示例 | 
|---|---|---|
| 结构,ByVal | 以 In 参数的形式传递结构。 | Custom\CS\Structs.cs Custom\VB\Structs.vb | 
| 结构,ByRef | 以 In/Out 参数的形式传递结构。 | WinAPIs\CS\OSInfo.cs WinAPIs\VB\OSInfo.vb | 
| 类,ByVal | 以 In/Out 参数的形式传递只有整数成员的类。 | WinAPIs\CS\SysTime.cs WinAPIs\VB\SysTime.vb | 
| 具有嵌套结构的结构(单一化) | 在非托管端生成一个类,该类表示具有嵌套结构的结构。在托管端的一个大结构中对结构进行了单一化。 | WinAPIs\CS\FindFile.cs WinAPIs\VB\FindFile.vb | 
| 具有嵌套结构的结构(未单一化) | 传递具有嵌入结构的结构。 | Custom\CS\Structs.cs Custom\VB\Structs.vb | 
| 包含指向另一个结构的指针的结构 | 传递包含指向另一个结构的指针并以其作为成员的结构。 | Custom\CS\Structs.cs Custom\VB\Structs.vb | 
| 只包含整数的结构数组,ByVal | 传递只包含将整数作为 In/Out 参数的结构的数组。 | Custom\CS\Arrays.cs Custom\VB\Arrays.vb | 
| 包含整数和字符串的结构数组,ByRef | 以 Out 参数的形式传递包含整数和字符串的结构的数组。被调用方为数组分配内存。 | Custom\CS\OutArrayOfStructs.cs Custom\VB\OutArrayOfStructs.vb | 
| 具有值类型的联合 | 传递具有值类型(整型和双精度型)的联合。 | Custom\CS\Unions.cs Custom\VB\Unions.vb | 
| 具有混合类型的联合 | 传递具有混合类型(整型和字符串类型)的联合。 | Custom\CS\Unions.cs Custom\VB\Unions.vb | 
如何封送数组
| 数组 | 说明 | 示例 | 
|---|---|---|
| 整数数组,ByVal | 将整数数组作为 In/Out 参数传递。 | Custom\CS\Arrays.cs Custom\VB\Arrays.vb | 
| 整数数组,ByRef | 将整数数组作为 In/Out 参数传递。可以调整数组的大小。 | Custom\CS\Arrays.cs Custom\VB\Arrays.vb | 
| 整数二维数组,ByVal | 以 In/Out 参数的形式传递整数矩阵。 | Custom\CS\Arrays.cs Custom\VB\Arrays.vb | 
杂项
| 项的类型 | 说明 | 示例 | 
|---|---|---|
| HandleRef | 介绍了一种需要使用 HandleRef 来防止垃圾回收的情况。 | WinAPIs\CS\HandleRef.cs WinAPIs\VB\HandleRef.vb | 
| 函数指针 | 将委托传递给需要函数指针的非托管函数。 | Custom\CS\Callback.cs Custom\VB\Callback.vb | 
| void* | 调用将 void* 作为参数的函数。 | Custom\CS\Void.cs Custom\VB\Void.vb | 
| LPARAM | 使用 GCHandle 将托管对象传递给需要 LPARAM 的非托管函数。 | WinAPIs\CS\GCHandle.cs WinAPIs\VB\GCHandle.vb | 
| 单线程单元 (STA)/多线程单元 (MTA) | 在非托管函数调用 CoInitialize 时更改默认单元设置。 | WinAPIs\CS\ActiveDir.cs WinAPIs\VB\ActiveDir.vb | 
有关平台调用的更多信息,请参见源代码文件中的注释。