2

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

RegAsm /codebase  TestCom.dll /TLB

它在 JavaScript 中可以正常工作:

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

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

这是应该的方式吗?当我尝试添加对 tlb 文件的引用时,出现错误:

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

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

4

1 回答 1

7

IDE 可以从类型库中得知您选择的 COM 服务器是在 .NET 中实现的。它只是拒绝让你添加它,这样做没有意义。当您改为添加对 .NET 程序集的引用时,它会同样有效,实际上效果更好。

不是不能骗机器,可以用动态关键字后期绑定。IDE 无法对此进行干预。但是您实际上并没有像非托管客户端使用服务器的方式那样测试 COM 服务器。CLR 将在运行时发现 COM 服务器实际上是一个 .NET 服务器并为管道提供快捷方式。换句话说,它不会为服务器创建 RCW。而且服务器不会创建 CCW,现在它的工作方式与添加程序集引用时的工作方式完全相同。

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

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

于 2013-11-13T10:59:31.717 回答