【发布时间】:2009-09-26 20:37:45
【问题描述】:
好的,我创建了一个 c# dll,将其所有接口和方法全部设为 ComVisible(true)。使用 gacutil 将其添加到 GAC,然后使用 regasm 注册并创建类型库 tlb 文件。
现在我有另一个 c# 项目,我想调用该 com 对象,我该怎么做?导入 com 对象然后使用其调用的代码大致是什么样的?
【问题讨论】:
好的,我创建了一个 c# dll,将其所有接口和方法全部设为 ComVisible(true)。使用 gacutil 将其添加到 GAC,然后使用 regasm 注册并创建类型库 tlb 文件。
现在我有另一个 c# 项目,我想调用该 com 对象,我该怎么做?导入 com 对象然后使用其调用的代码大致是什么样的?
【问题讨论】:
首先,您为什么要通过 COM 在您的其他 C# 项目中调用该 C# 程序集(您已使其成为可共存的)?没必要……
主题: 如果你已经创建了一个 tlb 文件,那么你不应该做任何特别的事情。您可以只引用您创建的 c#assembly 的“运行时可调用包装器”。
【讨论】:
第 1 步:创建 Runtime-Callable-Wrapper。 有两种方法
方法一:使用TlbImp生成RCW
tlbimp <YourCOMSvr>.tlb /out:<YourCOMSvr>.dll
使用这种方式是使用默认的 .NET-Interop Marshalling,有时(意味着当它不起作用时)您需要通过执行附加步骤来更改编组
ildasm <YourCOMSvr>.dll /out:<YourCOMSvr>.il
//Modify <YourCOMSvr>.il
ilasm <YourCOMSvr>.il /dll
方法2:手动创建一个C++/Cli项目作为COM服务器的封装
第 2 步:C# 代码
引用 RCW 并使用以下代码连接到 COM 服务器
Type yourComType= Type.GetTypeFromProgID(yourComSvrProgID, serverPcName);
var oInterface = (IYourCOMInterface)Activator.CreateInstance(yourComType);
//Then start using oInterface
【讨论】:
当您的 C# 组件成为符合 COM 标准的组件时,它也开始表现得像符合标准的 ActiveX 组件。
因此,测试 COM 调用的一个简单方法是使用 JavaScript 编写一个简单的 HTML 页面代码如下:
Set MyCOMObj = Server.CreateObject("NAME_OF_COM_EXPOSED_CLASS");
MyCOMObj.My_COM_Method();
如果您能够调用这样的方法而没有任何错误,则意味着您的 COM 调用工作正常。
感谢和问候
Anugrah Atreya
http://explorecsharp.blogspot.com
【讨论】: