65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 C# 访问 COM+ 组件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (12投票s)

2001 年 10 月 31 日

3分钟阅读

viewsIcon

163835

downloadIcon

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 对象的方法。

结论

本文给出了使用旧 COM 应用程序的一个非常基本的想法,为了简单起见,并且为了专注于文章的目的,没有进行错误处理。 在我的下一篇文章中,我们将看到如何在 VB 中使用 .NET 组件。
© . All rights reserved.