如何在c#中调用我使用RegistrationServices注册的COM对象?

本文关键字:注册 RegistrationServices COM 对象 调用 | 更新日期: 2023-09-27 18:03:48

我正在试验COM对象,并创建了一个简单的COM服务,它作为一个计算器,可以进行加、减、乘、除(细节不重要)。

然后我写了一些代码将它动态地注册到c#应用程序

Assembly asm = Assembly.LoadFile("C:''...COMCalc.dll");
RegistrationServices regAsm = new RegistrationServices();
bool bResult = regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase);

注册后,我已经能够使用javascript从IE浏览器的服务。

var num1 = 2
var num2 = 2
var objTest = new ActiveXObject("COMCalc.COMCalc")
alert(num1 + " - " + num2 + " = " + objTest.Subtract(num1,num2))

我想现在能够测试它从我的c#应用程序,所以我可以有一个注册,注销,和测试方法为我的COM对象。我一直在努力寻找如何做到这一点的文档。什么好主意吗?

附加说明:我还想使用在COM对象中定义的GUID来访问它,而不是使用COMCalc。

如何在c#中调用我使用RegistrationServices注册的COM对象?

   regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase)
通过编写您自己的自定义注册方法,您错过了COM客户端程序或单元测试人员将运行您的代码的正常方式。它们将使用COM组件的类型库,这是一个机器可读的文件,描述从组件公开的类型。它相当于。net元数据。

你得到一个类型库通过使用正常的方式注册,要么通过使用您的项目的"注册COM互操作"设置或运行Regasm.exe与/tlb选项。或者通过运行Tlbexp.exe手动生成。

然而,这并不能让你用c#单元测试来测试你的组件,你通常会使用Project> Add Reference> Browse并选择.tlb文件。但是IDE拒绝接受它,它可以看到类型库是从。net程序集创建的。它坚持使用普通的程序集引用,而不是选择DLL。

有一个很好的理由。您可以通过使用晚期绑定来欺骗IDE,但这并不能欺骗CLR。换句话说,您根本不是在测试COM互操作。您还可以使用常规方式添加. net程序集引用。真正测试组件需要使用用非语言编写的COM客户端。网络语言。没有那么多实用的了,你可以使用脚本语言,比如Javascript或VBScript。它越接近将要使用组件的实际语言和运行时环境越好。如果你打算在浏览器中使用它,那么像Selenium或HtmlAgilityPack这样的东西将是明智的选择。

没有人喜欢听那样的建议。通过后期绑定欺骗IDE,这与您在浏览器中所做的非常相似:

Type type = Type.GetTypeFromProgID("COMCalc.COMCalc");
dynamic obj = Activator.CreateInstance(type);
dynamic result = obj.Subtract(2, 1);