是否可以从.NET测试COM暴露的程序集?

问题描述:

我有一个.NET程序集,我已经通过tlb文件暴露给COM,以及注册了tlb的安装程序。我已手动检查安装程序是否正常工作,并且COM客户端可以访问该库。到目前为止,这么好...是否可以从.NET测试COM暴露的程序集?

但是,我试图把一些自动系统测试放在一起,检查安装程序是否正常工作。作为其中的一部分,我已经在VM上自动完成了安装,现在我想对安装的COM库进行一些调用,以验证它是否正常工作。我原本以为在VB6中编写一些测试,但我已经有一大堆用C#编写的测试,它引用了.NET程序集。我希望我可以改变这些引用.tlb,但是当我在VS2008中尝试这个时出现错误:

ActiveX类型库'blah.tlb'从.NET程序集中导出,无法添加作为参考。

有什么办法可以欺骗VS2008进入允许我添加这个引用,也许通过编辑tlb文件?

谷歌没有提出任何解决方案。所有我发现是微软的连接文章称,这是“通过设计”:http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=120882

+0

有几个人提到使用tlbimp.exe。如果我尝试tlbimp.exe是blah.tlb我得到的错误:“等等,从一个CLR程序集导出,并且不能被重新导入为CLR组件类型库” – Akash 2008-12-15 11:35:47

的最近我已经得到了一个解决方案被称为是如下所示:

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实例化放入构造函数中,并将其余的调用包装到该对象中,但对于测试代码可能不需要。

使用tlbimp.exe可以生成从您的COM组件的装配中,可以在.NET代码中使用

+2

若COM组件在C#或其他.NET语言创建 – 2011-04-18 19:04:44

+2

-1理由相同意见:若COM组件在C#或其他.NET语言创建 – peenut 2011-08-30 10:56:51

你应该能够使用TLBImp为已安装的COM组件创建包装类,然后针对该组件运行测试。你会基本上可以写一个.NET程序集,安装,为COM然后对包装类测试,以便您的测试将被路由,就好像它是由一个COM组件