我正在尝试使用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对象提供注册,取消注册和测试方法。我一直在努力寻找如何做到这一点的文档。有任何想法吗?
Bonus:我也想使用COM对象中定义的GUID来访问它,而不是COMCalc。
答案 0 :(得分:1)
regAsm.RegisterAssembly(asm, AssemblyRegistrationFlags.SetCodeBase)
通过编写自己的自定义注册方法,您错过了COM客户端程序或单元测试人员将执行代码的正常方式。他们将使用COM组件的类型库,这是一个机器可读的文件,用于描述从组件中公开的类型。它是COM等效的.NET元数据。
您可以使用正常的注册方式获得一个类型库,方法是使用您的项目"注册COM Interop"设置或使用/ tlb选项运行Regasm.exe。或者通过运行Tlbexp.exe手动生成它。
然而,这不允许您使用C#单元测试来测试组件,您通常使用Project>添加参考>浏览并选择.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);