我编写了一个 COM 可见的简单 .NET 项目(类库)。它适用于VB6!
代码如下所示:
[ComVisible(true)]
[ClassInterface(ClassInterfaceType::AutoDual)]
public ref class MyObject
{
// Some methods and values
}
程序集已正确签名(如果不在 GAC 中则不需要)并注册 (
regasm MyProject.dll /tlb /codebase
)。然后,在我的VB6项目中引用了TLB文件,一切正常!我可以访问我的类(class)和其中的公共(public)方法。
网上很多人说用
ClassInterfaceType::AutoDual
这不是一个好主意,因为版本控制的潜在问题可能会破坏使用该程序集的应用程序。但是,就我而言,这真的有问题吗?此程序集仅用于 VB6 项目(早期绑定(bind))。
在每个新版本中,我都会执行这些步骤(签名、注册等)。这个解决方案可能有任何版本问题吗?
无论如何,我可以写一些
[GUID("...")]
属性?GUID 由 Visual Studio 自动生成,因此每次编译时类的 GUID 不同。这样对吗?
最佳答案
如果不使用 AutoDual,VB6 中的早期绑定(bind)将无法工作。此外,自动完成功能在 VB6 编辑器中不再起作用,因此导致运行时错误的键入错误的风险更高。 VB6 程序员往往对此习惯了,所以可能会坚持下去。
当然,这是有风险的。如果您更新 COM 服务器并且错误地指定了 [Guid] 而没有更新它,那么 VB6 程序将在运行时因完全无法诊断的错误而崩溃的风险很大。或者更糟糕的是,根本不会崩溃,而是调用了完全错误的方法。
如果您让 .NET 自动生成 [Guid](强烈推荐),那么您不会遇到硬崩溃,而是在运行时出现“ActiveX 组件无法创建对象”错误。这更有帮助,当然也更不危险,但给您或用户很少的关于在哪里寻找问题的指导。
如果您使用 ComInterfaceType.InterfaceIsIDispatch,则 VB6 程序员被迫使用后期绑定(bind)并使用 GetObject() 创建对象。 [Guid] 不再重要,如果更改不是太激进,现有 VB6 代码仍然可以使用 COM 服务器的可能性更高。如果,比如说,一个方法获得了一个额外的参数,它仍然会爆炸。它会有更好的运行时错误。 VB6 程序员当然不指望改变方法的逻辑,否则不能治愈。缺点是方法调用会慢很多。
关于.net - 使用 ClassInterfaceType.AutoDual 真的是个坏主意,即使使用 VB6?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18272531/