互作性概述

互作性使你能够保留并利用非托管代码中的现有投资。 在公共语言运行时(CLR)的控制下运行 的代码是托管代码,在 CLR 外部运行 的代码是非托管代码。 COM、COM+、C++ 组件、ActiveX 组件和 Microsoft Windows API 是非托管代码的示例。

.NET 通过平台调用服务、System.Runtime.InteropServices 命名空间、C++ 互操作性和 COM 互操作性(COM interop)实现与非托管代码的互操作性。

平台调用

平台调用 是一项服务,它使托管代码能够调用在动态链接库(DLL)中实现的非托管函数,例如Microsoft Windows API。 它查找并调用导出的函数,并根据需要跨互作边界封送其参数(整数、字符串、数组、结构等)。

有关详细信息,请参阅“使用非托管 DLL 函数”以及如何使用平台调用来播放 WAV 文件

注释

公共语言运行时(CLR)管理对系统资源的访问。 调用 CLR 外部的非托管代码会绕过此安全机制,因此会带来安全风险。 例如,非托管代码可能会直接调用非托管代码中的资源,从而绕过 CLR 安全机制。 有关详细信息,请参阅 .NET 中的安全性

C++ 互操作

可以使用C++互操作(也称为 It Just Works(IJW))来包装原生C++类。 C++互作使以 C# 或其他 .NET 语言编写的代码可以访问它。 编写C++代码来包装本机 DLL 或 COM 组件。 与其他 .NET 语言不同,Visual C++具有互作性支持,可在同一应用程序中甚至同一文件中启用托管和非托管代码。 然后使用 /clr 编译器开关生成托管程序集,以便生成 C++ 代码。 最后,为您的 C# 项目添加程序集引用,并使用封装的对象,就像使用其他托管类一样。

向 C# 公开 COM 组件

可以使用 C# 项目中的 COM 组件。 常规步骤如下所示:

  1. 找到要使用的 COM 组件并注册它。 使用 regsvr32.exe 注册或取消注册 COM DLL。
  2. 向项目添加对 COM 组件或类型库的引用。 添加引用时,Visual Studio 使用 Tlbimp.exe(类型库导入程序),它将类型库作为输入,以生成 .NET 互操作程序集。 该程序集(也称为运行时可调用包装器(RCW)包含托管类和接口,这些类和接口包装了类型库中的 COM 类和接口。 Visual Studio 向项目添加对生成的程序集的引用。
  3. 创建 RCW 中定义的类的实例。 创建该类的实例将创建 COM 对象的实例。
  4. 使用对象就像使用其他托管对象一样。 当对象被垃圾回收机制回收时,COM 对象的实例也会从内存中释放。

有关详细信息,请参阅 向 .NET Framework 公开 COM 组件

向 COM 公开 C#

COM 客户端可以使用已经正确公开的 C# 类型。 公开 C# 类型的基本步骤如下所示:

  1. 在 C# 项目中添加互作属性。 可以通过修改 C# 项目属性使程序集 COM 可见。 有关详细信息,请参阅 “程序集信息”对话框
  2. 生成 COM 类型库并将其注册以供 COM 使用。 可以修改 C# 项目属性以自动注册用于 COM 互作的 C# 程序集。 Visual Studio 通过 命令行开关使用 /tlb。此工具使用托管组件作为输入,以生成类型库。 此类型库描述 public 程序集中的类型,并添加注册表项,以便 COM 客户端可以创建托管类。

有关详细信息,请参阅 向 COM 公开 .NET Framework 组件示例 COM 类

另请参阅