如何将另一个.NET程序集中的ComVisible .NET库用作COM库。

时间:2013-11-13 10:33:51

标签: c# .net com

我为.Net 4.0创建了一个测试COM项目。然后我用regasm注册它:

RegAsm /codebase  TestCom.dll /TLB

它在JavaScript中正常运行:

var app = new ActiveXObject("TestCom.TestClass");
app.Message1("123");

我想从.Net 3.5的另一个C#项目中使用TestCom.TestClass,但是当我尝试添加对该项目的引用时,我收到有关更高框架版本的错误。 “添加引用”对话框(COM部分)仅显示对tlb文件的引用,而不是dll。

这是应该的样子吗?当我尝试添加对tlb文件的引用时,我收到错误:

  

“添加对.NET程序集的引用”

如何从.Net 3.5的另一个C#项目创建TestCom.TestClass实例?

1 个答案:

答案 0 :(得分:7)

IDE可以从类型库中判断出您选择的COM服务器是在.NET中实现的。它只是拒绝让你添加它,这样做没有意义。当您添加对.NET程序集的引用时,它也会更好地工作,实际上更好。

您不能欺骗机器,您可以使用动态关键字进行后期绑定。 IDE没办法干扰它。但是你实际上正在以非托管客户端使用服务器的方式测试COM服务器。 CLR将在运行时发现COM服务器实际上是一个.NET服务器并快捷方式管道。换句话说,它不会为服务器创建RCW。并且服务器不会创建CCW,这现在可以使用 exact ,如果添加了程序集引用,它将会起作用。

所以这样做真的没有意义。只需添加程序集引用,即可享受IntelliSense支持和静态类型检查带来的诸多优势。并以测试任何.NET库的方式测试COM服务器代码。 COM互操作层是你测试的,从根本上无法测试的。哪个没关系,它不是真的有问题。如果它出于一些神秘的原因,那就不像你可以对它做些什么,CLR内部的COM互操作无论如何都是黑盒子。

除了测试服务器代码之外,您还需要执行集成测试。只需确保实际的非托管客户端实际上可以使用服务器。你做到了,你已经知道它在Javascript中运行良好。