.net - 使用 ClassInterfaceType.AutoDual 真的是个坏主意,即使使用 VB6?

标签 .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文件,一切正常!我可以访问我的类(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/

相关文章:

vb6 - Textwidth 无法以毫米为单位正确显示 vb6

.net - .Net 中的 Oracle Datareader - 速度太慢(通过网络)

c# - 如何将强名称公钥 (snk) 转换为 <RSAKeyValue>?

c# - NHibernate尝试为FK映射插入现有记录,但仅当int ID为0时

javascript - 在 Delphi 中创建 NPAPI 插件并使用 javascript 访问导出的 API

com - 从 .NET 程序集创建对象时,VB6 中出现后期绑定(bind)运行时错误

c# - Visual C# - 引用 > 添加引用... > COM : How is that list populated?

.net - 如何使用 XmlSerializer 序列化 System.Type 对象?

vb6 - VB6中的蜂鸣功能。什么 "beeps"?

unicode - 如何将 Unicode 字符转换为转义码