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

Kev*_*ier 6 .net vb6 com c++-cli

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

代码如下所示:

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

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

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

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

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

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

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

GUID由Visual Studio自动生成,因此每个编译时类都不是相同的GUID.这样对吗?

Han*_*ant 11

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

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

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

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

  • 我已经在我的回答中说过,自动完成与IntelliSense是一样的,你不想使用GetObject.显然你坚持使用AutoDual. (2认同)