使用 C# 访问 COM+ 组件






4.75/5 (12投票s)
2001 年 10 月 31 日
3分钟阅读

163835

1526
本文提供了使用 C# 访问 COM+ 应用程序的分步说明。
摘要
本文逐步讲解了如何使用 C# 访问 COM+ 应用程序。 代码使用 beta2 编译。 Microsoft (R) Visual C# Compiler Version 7.00.9254 [CLR version v1.0.2914]。 经过少量修改,它也可以与 Beta1 一起使用。
如果我们想使用任何 .net 支持的语言访问现有的 COM+ 应用程序,我们不需要修改现有 COM+ 应用程序的任何一行代码,尽管它们的执行模型完全不同。 这里有一个逐步的简单例子来说明如何做到这一点。 我们可以通过两种方式访问它,早期绑定和后期绑定(记住旧的 VB 概念)。 我们将首先查看早期绑定的例子...
早期绑定
所需工具
TlbImp.exe
: (类型库导入程序) 将 COM 组件中找到的类型定义导入(转换、生成包装器 DLL)为等效的 .net 定义(或元数据),可被公共语言运行时 (CLR) 理解。 由 TlbImp 生成的元数据可以通过 Ildasm.exe
查看。 如果您使用 Visual Studio 开发环境,您只需要添加对 COM 类型库的引用,转换就会自动完成。
开始吧
要使用现有的 COM+ 应用程序,我们需要使用 TlbImp.Exe
创建运行时可调用包装器 (RCW)。 使用 VS.Net 时,当我们引用现有的 COM 组件时,它会自动创建。 区别在于,VS.Net 创建的 RCW 与原始 DLL 同名,这可能会造成混淆,而使用 TlbImp.Exe
,我们可以使用 /out:
参数指定不同的名称。
假设我们有一个 COM 组件,它有一个 Add 方法,该方法接受两个参数 A 和 B 并返回总和。
注意:在使用 COM DLL 之前,我们必须先注册它...'CompAdd.Dll (class1) Public Function Add(A As Long, B As Long) As Long Add = A + B End Function
现在我们将在现有的 DLL 中运行 TlbImp.Exe
,即 CompAdd.Dll

这生成了一个包装器 dll CompAddRcw.dll。 我们可以使用 IlDasm.Exe
查看这个 DLL

关于 IlDasm.Exe
的讨论超出了本文的范围。 现在我们将简单地编写代码来使用包装器 DLL,而包装器 DLL 反过来将调用实际的 DLL。 现在让我们看一下 C# 代码是如何实现的。

正如我们所看到的,当我们进行早期绑定时,我们得到的是与 VB 中相同的工具提示。 使用 /r: 开关编译程序,例如 csc TestClient.cs /r:CompAddRcw.dll
。 执行它,我们就用 .net 调用了 COM 组件。
延迟绑定
对于后期绑定,我们必须使用System.Reflection
命名空间,它允许我们以编程方式访问任何程序集中包含的类型。 我们将看到如何在四个简单的步骤中进行后期绑定。- 我们使用
Type.GetTypeFromProgID("Project1.Class1")
获取IDispatch
接口 - 我们必须使用类型 ID
Activator.CreateInstance(objAddType)
创建实例 - 我们必须创建参数数组(如果需要)
- 使用
objAddType.InvokeMember
函数调用方法。

Type.GetTypeFromProgID
方法用于加载 COM 对象的类型信息。 对 Activator.CreateInstance
的调用返回 COM 对象的一个实例。 最后,InvokeMember
函数用于调用 COM 对象的方法。