.net - 发布 Tlb 新版本以及何时需要重新引用 Tlb

标签 .net vba com excel com-interop

我有一个 C# dll 并使用 regasm 生成了一个 tlb。我已经向使用此 tlb 的用户提供了一个实用程序电子表格。每次发布我们的应用程序的新版本时,都会取消注册并注册(使用 regasm.exe)tlb。

但是,有时,当用户在新版本后使用电子表格时,它会抛出“activex 组件无法创建实例”错误,恰好在我创建某种类型的对象的代码行上。我只是通过删除并添加 tlb 引用来修复此问题。 (在vba模式下-工具-引用-取消选中tlb-保存-然后再次添加)。然而,这很痛苦,因为我无法为所有用户执行此操作。

我做了几次测试来复制这个场景。比如改变dll的版本号并重新注册、向接口(interface)添加新方法并重新注册等。但在所有情况下,电子表格都可以正常工作,无需删除并重新添加 tlb 引用。

因此,我很困惑在电子表格中必须重新添加 tlb 作为引用的情况可能是什么,以及可能的原因是什么。如有任何帮助,我们将不胜感激。

谢谢, 玛尼

最佳答案

该问题很可能是由于类型库的UUID发生变化导致VBA中的引用无效引起的。

1)那边有一个人写了一个VBA program to add TLB references and delete invalid ones !

2) 这可能与您先卸载旧版本然后安装新版本有关。 RegAsm's manual提到相反的顺序。 VBA 可能有一些自动更新它们的逻辑,这只适用于 M$ 人员想到的更新顺序。
另一种可能性是 Excel 在更新期间正在运行,因此它没有按预期更新其引用列表。

3) 为了进一步诊断问题,我将使用 procmon.exe。有关 COM 的所有内容都会在注册表中查找,因此如果出现错误,您可能会遇到应用程序无法找到某些 UUID key 的情况。

关于.net - 发布 Tlb 新版本以及何时需要重新引用 Tlb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9293440/

相关文章:

.net - WinForms 音量 slider /轨迹栏用户控制

c# - windows窗体C#画线的最佳方式

c# - 设置进程调度程序的框架

vba - 禁用 "Save when Close"提示时 Excel 拒绝关闭

vba - 在 VBA 中创建带有集合的类

html - Excel VBA 抓取 - HTML 表格不可见

c# - 如何销毁 C# 中的 COM 对象?

.net - 使用 WiX 安装程序复制 Visual Studio COM 注册

c# - 如何使用 C# 获取总线报告的设备描述

c++ - 使用 C++ 删除 WMI 实例