互操作性概述(C# 编程指南)
本主题描述在 C# 托管和非托管代码之间实现互操作性的方法。
平台调用
平台调用是一种服务,它使托管代码可以调用在动态链接库 (DLL)(如 Microsoft Win32 API 中的那些 DLL)中实现的非托管函数。此服务将查找并调用导出的函数,然后根据需要跨越互用边界封送其参数(整数、字符串、数组、结构等)。
有关更多信息,请参见使用非托管 DLL 函数和 如何:使用平台调用播放波形文件(C# 编程指南)。
注意 |
---|
公共语言运行时 (CLR) (CLR) 管理对系统资源的访问。调用 CLR 外部的非托管代码会避开此安全机制,因此会带来安全风险。例如,非托管代码可能会直接调用非托管代码中的资源,从而避开 CLR 安全机制,。有关更多信息,请参见 .NET Framework Security(.NET Framework 安全性)。 |
C++ Interop
可以使用 C++ Interop(又称为 It Just Works (IJW))包装本机 C++ 类,使得用 C# 或其他 .NET Framework 语言编写的代码可以使用它。为此,可以编写 C++ 代码来包装本机 DLL 或 COM 组件。与其他 .NET Framework 语言不同,Visual C++ 支持互操作性,允许托管代码和非托管代码存在于同一个应用程序中,甚至存在于同一个文件中。然后,可以使用 /clr 编译器开关生成 C++ 代码,从而生成托管程序集。最后,在 C# 项目中添加一个对该程序集的引用,并像使用其他托管类那样使用被包装对象。
向 C# 公开 COM 组件
可以使用 C# 项目中的 COM 组件。一般步骤如下所示:
找到要使用的 COM 组件并注册它。使用 regsvr32.exe 注册或注销 COM DLL。
在项目中添加对 COM 组件或类型库的引用。
添加引用时,Visual Studio 会用到Tlbimp.exe(类型库导入程序),后者将类型库作为输入并输出一个 .NET Framework 互操作程序集。该程序集又称为运行时可调用包装 (RCW),其中包含了包装类型库中的 COM 类和接口的托管类和接口。Visual Studio 将生成组件的引用添加至项目。
创建在 RCW 中定义的类的实例。而这样会创建 COM 对象的实例。
像使用其他托管对象那样使用该对象。当垃圾回收对该对象进行回收后,COM 对象的实例也会从内存中释放出来。
有关更多信息,请参见 向 .NET Framework 公开 COM 组件。
向 COM 公开 C
COM 客户端可以使用已经正确公开的 C# 类型。公开 C# 类型的基本步骤如下所示:
在 C# 项目中添加互操作特性。
可以通过修改 Visual C# 项目属性使程序集 COM 可见。有关更多信息,请参见 “程序集信息”对话框。
生成 COM 类型库并对它进行注册以供 COM 使用。
可以修改 Visual C# 项目属性以自动注册 COM interop 的 C# 组件。Visual Studio 使用 Regasm.exe(程序集注册工具),方法是使用 /tlb 命令行切换,其将管理的组件作为输入,以生成类型库。此类型库描述程序集中的 public 类型并添加注册表项,以便 COM 客户端可以创建托管类。
有关更多信息,请参见向 COM 公开 .NET Framework 组件和 COM 类示例(C# 编程指南)。