1

我刚刚更新了从 Powerpoint 中的 VBA 调用的 dll。所有开发都很顺利,但是当我尝试在另一台用户机器上进行部署时,我遇到了一个我不知道如何调试的问题。

发生的情况是,当在 VBA 中创建 .Net 对象时,返回的引用指向错误的对象,因此下一行因找不到方法而失败。

Dim myObj As Foo.Bar

Public Sub RefreshData()

//'instantiate object
Set myObj = New Foo.Bar   
//'call a method
myObj.HelloWorld

最后一行因运行时错误“438”而失败,对象不支持此属性或方法,这是由于 myObj 的类型为“Wrong.Type”而不是“Foo.Bar”。

“Wrong.Type”也在程序集中,所以我认为类型库出了点问题,但我尝试过重新生成(使用 regasm /codebase /tlb MyLib.dll),但这并没有帮助。

我不知道如何进一步诊断。希望有人可以列出一些有关如何诊断此类问题的步骤?

4

2 回答 2

1

这可能是自动生成的 GUID(类、接口、类型库)的问题 - 当您更改 DLL 时,GUID 也发生了变化。由于旧 TLB 使用旧 GUID,通过引用它,您将这些旧 GUID 与类型名称相关联,因此代码无法使用新 GUID。我遇到的大多数 VB(6 和 .NET)代码都有这个问题,所以如果你的 DLL 是用 VB 编写的,那可能就是它(你的工作支持这个理论)。

如果这是问题所在,一般的解决方案是显式设置 GUID,如果您有很多类型,这会有点烦人,因为您应该在版本更改时更改 GUID,并且您必须手动完成。

于 2015-01-29T01:39:12.697 回答
0

在这种情况下,删除对 tlb 文件的引用,然后重新添加即可解决问题

不幸的是,我从来没有找到一个通用的解决方案,或者对这种行为的解释。

于 2011-10-14T13:32:40.867 回答