在 vba 中安装 Com Class 的多个版本
Installing multiple versions of a Com Class in vba
我正在 .net 中开发 COM class 并在 excel VBA 上使用它。
要求是每个 excel 文件都应使用其开发时使用的 class 版本。最好在代码中明确说明。
因此,如果安装了 class 的新版本,用户将 运行 旧宏与旧 class 和新宏与新 class.
到目前为止,我一直在将 dll 和根命名空间重命名为 Class1 Class2 class3。但这可能会导致安装问题。
GUID 是否会发生冲突并阻止我将它们安装为单独的 COM 对象?
我提出的解决方案:
让每个 excel 宏安装它们自己的 class 版本。
让他们在完成后将其卸载。
此外,添加 excel 宏卸载 class 的任何剩余版本的第一步。
如果多个宏同时 运行 或者在一台共享计算机中,这可能会出现问题。所以它只有在不需要时才有效。
每次构建时,将 GUID 更改为新内容。
.NET 在未设置 GUID 属性时自动执行此操作。
然后您可以重命名每个构建的根命名空间以包含版本。
这样你就可以从每个 excel.
调用特定版本的 class
拥有 COM 接口的关键在于将版本控制排除在外 - 如果您实际上要更改接口,通常的做法是为同一对象添加一个额外的接口。例如 IFoo
扩展另一个接口 IFoo2
第一次更改, IFoo3
下一次更改,等等
简而言之,如果界面的行为发生变化,那么它确实应该是一个新界面。同样的逻辑适用于 破坏 现有界面的更改。例如,如果您有类似...
IFoo.Bar(baz as string)
...并且实现发生变化,您将创建一个新方法,使用一个新接口,该接口使用该方法扩展旧接口 - 即:
public interface IFoo2 : IFoo
{
void Bar2(string baz);
}
然后在您的更改说明中记录调用者应该使用较新的界面因为扩展的功能。 Microsoft 对 Windows API 中的 *Ex
方法做了类似的事情,IIR 对 MS Office 中的一些对象做了同样的事情。
另一种方法是更新您的单元测试以考虑新的调用约定(假设可接受的参数范围正在改变但 return 值 没有 改变) ,然后编码到单元测试。在这种情况下,接口 本身 不会改变,只要它仍然产生与原始输入范围相同的行为。
我正在 .net 中开发 COM class 并在 excel VBA 上使用它。 要求是每个 excel 文件都应使用其开发时使用的 class 版本。最好在代码中明确说明。 因此,如果安装了 class 的新版本,用户将 运行 旧宏与旧 class 和新宏与新 class.
到目前为止,我一直在将 dll 和根命名空间重命名为 Class1 Class2 class3。但这可能会导致安装问题。 GUID 是否会发生冲突并阻止我将它们安装为单独的 COM 对象?
我提出的解决方案:
让每个 excel 宏安装它们自己的 class 版本。
让他们在完成后将其卸载。
此外,添加 excel 宏卸载 class 的任何剩余版本的第一步。
如果多个宏同时 运行 或者在一台共享计算机中,这可能会出现问题。所以它只有在不需要时才有效。
每次构建时,将 GUID 更改为新内容。
.NET 在未设置 GUID 属性时自动执行此操作。
然后您可以重命名每个构建的根命名空间以包含版本。 这样你就可以从每个 excel.
调用特定版本的 class拥有 COM 接口的关键在于将版本控制排除在外 - 如果您实际上要更改接口,通常的做法是为同一对象添加一个额外的接口。例如 IFoo
扩展另一个接口 IFoo2
第一次更改, IFoo3
下一次更改,等等
简而言之,如果界面的行为发生变化,那么它确实应该是一个新界面。同样的逻辑适用于 破坏 现有界面的更改。例如,如果您有类似...
IFoo.Bar(baz as string)
...并且实现发生变化,您将创建一个新方法,使用一个新接口,该接口使用该方法扩展旧接口 - 即:
public interface IFoo2 : IFoo
{
void Bar2(string baz);
}
然后在您的更改说明中记录调用者应该使用较新的界面因为扩展的功能。 Microsoft 对 Windows API 中的 *Ex
方法做了类似的事情,IIR 对 MS Office 中的一些对象做了同样的事情。
另一种方法是更新您的单元测试以考虑新的调用约定(假设可接受的参数范围正在改变但 return 值 没有 改变) ,然后编码到单元测试。在这种情况下,接口 本身 不会改变,只要它仍然产生与原始输入范围相同的行为。