即使使用VB6,使用ClassInterfaceType.AutoDual也是一个坏主意?

时间:2013-08-16 11:42:33

标签: .net com vb6 c++-cli

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

代码如下:

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

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

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

在互联网上,很多人都说使用ClassInterfaceType::AutoDual不是一个好主意,因为版本控制可能会破坏使用程序集的应用程序。

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

在每个新版本中,我都会回复这些步骤(签名,注册等)。这个解决方案可以解决任何版本问题吗?

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

GUID由Visual Studio自动生成,因此每个编译时类都不是同一个GUID。是不是?

1 个答案:

答案 0 :(得分:11)

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

当然,它有风险。如果更新COM服务器并且错误地指定了[Guid]而没有更新它,则存在很大的风险,即VB6程序在运行时会因完全不可诊断的错误而崩溃。或者更糟糕的是,根本不会崩溃,而是采用完全错误的方法。

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

如果使用ComInterfaceType.InterfaceIsIDispatch,则VB6程序员必须使用后期绑定并使用GetObject()来创建对象。 [Guid]不再重要了,如果更改不是太激进,现有VB6代码仍然可以使用COM服务器的概率更高。如果一个方法获得额外的论证,它仍然会轰炸。它会有更好的运行时错误。当然,VB6程序员没有依赖的方法逻辑的改变也没有办法解决问题。缺点是方法调用会慢得多。