如何在 C# 中调用使用 RegistrationServices 注册的 COM 对象

How do I call a COM object in C# that I registered using RegistrationServices

我正在试验 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。

   regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase)

通过编写您自己的自定义注册方法,您将错过 COM 客户端程序或单元测试人员运行您的代码的 正常 方式。他们将使用您的 COM 组件的类型库,这是一个机器可读的文件,描述了您从组件中公开的类型。它是 .NET 元数据的 COM 等价物。

您可以通过使用项目的 "Register for COM Interop" 设置或使用带有 /tlb 选项的 运行 Regasm.exe 的正常注册方式获得类型库。或者通过运行Tlbexp.exe手动生成。

然而,这不允许您使用 C# 单元测试来测试您的组件,您通常会使用“项目”>“添加引用”>“浏览”并选择 .tlb 文件。但是 IDE 拒绝接受它,它可以看到类型库是从 .NET 程序集创建的。它坚持要求您改用普通程序集引用,而是选择 DLL。

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

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

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