繁体   English   中英

我如何在我使用RegistrationServices注册的C#中调用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中等效。

通过使用普通的注册方法(通过使用项目的“注册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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM