能否从.NET测试一个暴露了COM接口的程序集?

11
我有一个.NET程序集,通过tlb文件对外暴露给COM,以及一个安装程序,用于注册tlb。我已经手动检查了安装程序的正确性,并且COM客户端可以访问该库。到目前为止,一切都很好...
但是,我正在尝试组合一些自动化系统测试,以检查安装程序是否正常工作。作为其中的一部分,我已经在虚拟机上自动化了安装过程,现在想调用已安装的COM库来验证其是否正常工作。我最初考虑使用VB6编写一些测试,但我已经有了一个引用.NET程序集的大型测试套件,使用C#编写。我希望我可以将这些测试更改为引用.tlb,但是当我在VS2008中尝试时会出现错误:
ActiveX类型库“blah.tlb”是从.NET程序集导出的,因此无法作为引用添加。
是否有任何方法可以欺骗VS2008,以允许我添加此引用,例如通过编辑tlb文件?
谷歌搜索没有找到任何解决方案。我找到的只是一个Microsoft Connect文章,说明这是“按设计”:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=120882

有几个人提到使用 tlbimp.exe。如果我尝试运行 tlbimp.exe blah.tlb,我会收到以下错误提示:“类型库 blah 是从 CLR 程序集导出的,不能作为 CLR 程序集重新导入。” - Akash
3个回答

12

我最接近一个解决方案的代码如下:

using System;
class ComClass
{
    public bool CallFunction(arg1, arg2)
    {
        Type ComType;
        object ComObject;

        ComType = Type.GetTypeFromProgID("Registered.ComClass");
        // Create an instance of your COM Registered Object.
        ComObject = Activator.CreateInstance(ComType);

        object[] args = new object[2];
        args[0] = arg1;
        args[1] = arg2;

        // Call the Method and cast return to whatever it should be.
        return (bool)ComType.InvokeMember("MethodToCall", BindingFlags.InvokeMethod, null, ComObject, args))
    }
}

这并不是很美观,但我认为能够传达重点。当然,你可以将ComObject实例化放入构造函数中,并包装对对象的其余调用,但可能对测试代码来说并不必要。


使用Type.GetTypeFromProgID方法可以获取COM类型,我尝试过这个方法,它可以工作(但是与直接添加引用相比有实际差异吗?我不知道)。 - peenut
在这个例子中,methodCOM 应该实际上是 ComType 变量。 - glebd

0

你应该能够使用 TLBImp 创建一个包装类来封装你已安装的 COM 组件,然后对其进行测试。基本上,你将编写一个 .Net 程序集,将其安装到 COM 中,然后针对包装类进行测试,这样你的测试就会被路由,就好像被一个 COM 组件调用一样。


嗯嗯嗯,不行!你不能同时拥有管理的COM服务器和客户端。TlbImp会失败的... - schwarz

-1

使用 tlbimp.exe 工具,您可以从 COM 组件生成一个程序集,该程序集可在 .NET 代码中使用。


3
如果COM组件是由C#或其他.NET语言创建的,则不能这样做。 - John Saunders
3
理由与评论相同:如果COM组件是由C#或其他.NET语言创建的,则不行。 - peenut

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接