6

我编写了一个 COM 可见的简单 .NET 项目(类库)。它适用于VB6!

代码如下所示:

[ComVisible(true)]
[ClassInterface(ClassInterfaceType::AutoDual)]
public ref class MyObject
{
    // Some methods and values
}

程序集已正确签名(如果不在 GAC 中则不需要)并注册 ( regasm MyProject.dll /tlb /codebase)。

然后,在我的VB6项目中引用了TLB文件,一切正常!我可以访问我的课程和其中的公共方法。

在 Internet 上,许多人说使用ClassInterfaceType::AutoDual不是一个好主意,因为版本控制的潜在问题可能会破坏使用该程序集的应用程序。

但是,就我而言,这真的有问题吗?此程序集仅用于 VB6 项目(早期绑定)。

在每个新版本中,我都会执行这些步骤(签名、注册等)。这个解决方案可能是任何版本控制问题吗?

无论如何,我可以写一些[GUID("...")]属性吗?

GUID 由 Visual Studio 自动生成,因此每次编译时类的 GUID 不同。这样对吗?

4

1 回答 1

11

如果不使用 AutoDual,VB6 中的早期绑定将无法工作。此外,自动完成功能在 VB6 编辑器中不再起作用,因此导致运行时错误的键入错误的风险更高。VB6 程序员倾向于习惯这一点,所以可能会坚持下去。

当然,这是有风险的。如果您更新 COM 服务器并且错误地指定了 [Guid] 而没有更新它,那么 VB6 程序将在运行时因完全无法诊断的错误而崩溃的风险很大。或者更糟的是,根本没有崩溃,而是调用了完全错误的方法。

如果您让 .NET 自动生成 [Guid](强烈推荐),那么您不会遇到硬崩溃,而是在运行时出现“ActiveX 组件无法创建对象”错误。这更有帮助,当然也更不危险,但给你或用户在哪里寻找问题的指导很少。

如果您使用 ComInterfaceType.InterfaceIsIDispatch,则 VB6 程序员被迫使用后期绑定并使用 GetObject() 创建对象。[Guid] 不再重要,如果更改不是太激进,现有 VB6 代码仍然可以使用 COM 服务器的可能性更高。如果,比如说,一个方法获得了一个额外的参数,它仍然会爆炸。它会有更好的运行时错误。VB6 程序员当然不指望这种方法的逻辑变化,否则不能治愈。一个缺点是方法调用会慢很多。

于 2013-08-16T12:10:28.143 回答