互作性使你能够保留并利用非托管代码中的现有投资。 在公共语言运行时(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 组件。 常规步骤如下所示:
- 找到要使用的 COM 组件并注册它。 使用 regsvr32.exe 注册或取消注册 COM DLL。
- 向项目添加对 COM 组件或类型库的引用。 添加引用时,Visual Studio 使用 Tlbimp.exe(类型库导入程序),它将类型库作为输入,以生成 .NET 互操作程序集。 该程序集(也称为运行时可调用包装器(RCW)包含托管类和接口,这些类和接口包装了类型库中的 COM 类和接口。 Visual Studio 向项目添加对生成的程序集的引用。
- 创建 RCW 中定义的类的实例。 创建该类的实例将创建 COM 对象的实例。
- 使用对象就像使用其他托管对象一样。 当对象被垃圾回收机制回收时,COM 对象的实例也会从内存中释放。
有关详细信息,请参阅 向 .NET Framework 公开 COM 组件。
向 COM 公开 C#
COM 客户端可以使用已经正确公开的 C# 类型。 公开 C# 类型的基本步骤如下所示:
- 在 C# 项目中添加互作属性。 可以通过修改 C# 项目属性使程序集 COM 可见。 有关详细信息,请参阅 “程序集信息”对话框。
- 生成 COM 类型库并将其注册以供 COM 使用。
可以修改 C# 项目属性以自动注册用于 COM 互作的 C# 程序集。 Visual Studio 通过 命令行开关使用
/tlb
。此工具使用托管组件作为输入,以生成类型库。 此类型库描述public
程序集中的类型,并添加注册表项,以便 COM 客户端可以创建托管类。
有关详细信息,请参阅 向 COM 公开 .NET Framework 组件 和 示例 COM 类。