【问题标题】:Installing multiple versions of a Com Class in vba在 vba 中安装多个版本的 Com 类
【发布时间】:2017-01-05 17:33:11
【问题描述】:

我正在.net 中开发一个 COM 类并在 excel VBA 上使用它。 要求是每个excel文件都应该使用它开发的类的版本。最好在代码中明确说明。 因此,如果安装了新版本的类,用户将使用旧类运行旧宏,并使用新类运行新宏。

到目前为止,我一直将 dll 和根命名空间重命名为 Class1 Class2 class3。但这可能会导致安装问题。 GUID 是否会发生冲突并阻止我将它们安装为单独的 COM 对象?

【问题讨论】:

  • @ComIntern 我考虑了更多,并且对于使用该类版本开发的宏肯定存在业务需求,以使用所述版本运行,直到显式升级。我不能指望我的插件的用户对它们进行单元测试,所以我不知道它们是否或何时会因升级而中断。如果您知道改进我的方法以符合要求的方法,我将很高兴听到它。
  • 说,旧的 URL 检查功能非常幼稚,用户做了 URL = "google.com" 之类的事情。这可能对他们的目的有用。如果我添加一个 URL 检查器来检查 http: 或 https: 我在引入新功能的同时破坏了旧代码。并且原始开发人员可能需要修改他们的代码,他们甚至可能不再与公司合作。所有这一切几乎没有任何收获。我想,我能看到的唯一优势是部署起来更容易。我想听听你对这个具体场景的解决方案是什么。
  • 转换为答案 - 清理 cmets...

标签: .net vba excel dll com


【解决方案1】:

我提出的解决方案:

让每个 excel 宏都安装自己的类版本。

完成后让他们卸载它。

此外,添加第一步,其中 excel 宏会卸载该类的任何剩余版本。

如果同时运行多个宏或在共享计算机上运行,​​这可能会出现问题。所以它只有在不需要时才有效。

【讨论】:

    【解决方案2】:

    拥有 COM 接口的意义在于消除版本控制 - 如果您实际上要更改接口,通常的做法是为同一个对象添加一个额外的接口。例如 IFoo 扩展另一个接口 IFoo2 与第一次更改,IFoo3 与下一次更改等

    简而言之,如果界面的行为发生变化,那么它确实应该是一个新的界面。相同的逻辑适用于破坏现有接口的更改。例如,如果您有类似...

    IFoo.Bar(baz as string)
    

    ...并且实现发生变化,您将创建一个新方法,使用一个新接口,该接口使用该方法扩展旧接口 - 即:

    public interface IFoo2 : IFoo
    {
        void Bar2(string baz);
    }
    

    然后在您的更改说明中记录调用者应该使用更新的接口,因为它具有扩展的功能。 Microsoft 对 Windows API 中的 *Ex 方法做了类似的事情,而 IIR 对 MS Office 中的一些对象做了同样的事情。

    另一种方法是更新您的单元测试以考虑新的调用约定(假设可接受的参数范围正在改变,但返回值没有改变),然后对单元测试进行编码。在这种情况下,界面本身不会改变,只要它仍然产生与原始输入范围相同的行为。

    【讨论】:

    • 我对这种方法的问题是我的课程会令人困惑。如果向用户呈现 URLFunction URLFunction2 和 URLFunction3,他应该使用哪一个?它还可能使设计更加复杂。以前我可以将所有 URLFunction 功能放在一个函数中,现在它需要放在 3 个不同的函数中。如果接口是一个类,这就更难了。
    • @TomasZubiri - 这是发布 COM 接口的缺点。我敢肯定,某些​​ Windows API 代码读起来非常痛苦,因为它们讨厌破坏接口。同样,最好的情况是在您进行更改时不会破坏现有界面。
    【解决方案3】:

    每次构建时,将 GUID 更改为新的。

    如果未设置 GUID 属性,.NET 会自动执行此操作。

    然后您可以重命名每个构建的根命名空间以包含该版本。 这样您就可以从每个 excel 中调用特定版本的类。

    【讨论】:

    • 好吧,那就不要使用 [Guid] 属性。 .NET 会根据声明自动生成一个。更改声明会产生一个新的 guid,就像 COM 需要的那样。然而,提高 [AssemblyVersion] 非常重要,这样即使没有更改的声明也会获得新的 guid。期望 Excel 将文件与加载项版本匹配,好吧,不。
    • @HansPassant 谢谢!我可以通过命名命名空间来使 excel 文件与类版本匹配,以便它包含版本
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-19
    • 1970-01-01
    • 2022-12-23
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多