【发布时间】:2020-08-08 07:30:47
【问题描述】:
我有一个在 Excel VBA 项目中使用的 C# 库。我现在希望重组我的项目并将库移动到不同的文件夹。但是,在删除对库的引用并从我的计算机中删除库的所有实例之后,该项目的“可用引用”框仍然显示对旧库位置的引用,即使它不再存在于计算机上,而且我似乎什么也没做能够删除该引用。
我不知道这是否有什么不同,但该项目是一个 Excel 插件。
我在 2019 年遇到了这个问题,并在 2019 年 4 月收到了对同名问题的回复。当时,按照给出的建议解决了这个问题。然而这一次系统顽固地拒绝打球。
建议我在 2019 年遵循的程序是:
- 删除引用
- 保存文件并关闭它
- 从您的计算机中删除 dll(在我的情况下为 .tbl)文件。不要将其保存在任何地方。
- 重新打开文件
- 检查是否还有任何引用。如果没有将 dll 复制到新文件夹,然后再次设置引用。保存并关闭文件。
- 重新打开检查是否一切正常
我正打算尝试代码删除引用,但是下面的代码没有找到引用
Sub delRef()
deleteReference ("FiskDLLlib")
End Sub
Sub deleteReference(s As String)
Dim oFs As Object, oReferences As Object, oReference As Object
Dim sFileName As String, sRefName As String, sRefFileName As String
Dim toBeDeletedRef As String
Set oReferences = Application.Workbooks("fiskAIWkBook.xlam").VBProject.References
For Each oReference In oReferences
sRefFileName = oReference.FullPath
sRefName = oReference.name
If sRefName = s Then
toBeDeletedRef = s
Exit For
End If
Next
If toBeDeletedRef <> "" Then
Debug.Print oReference.FullPath
Else
Debug.Print "No Reference found for " & s
End If
End Sub
同样,Watches 面板没有显示库。
我随后发现了一个注册表项 \HKEY_LOCAL_MACHINE\SOFTWARE\Classes\TypeLib{B22F6C9D-53E0-4D1B-9596-56AA1EA4BDBA}\1.0\0\win32 其值设置为我要删除的引用的位置。我将其更改为对要存储 dll (.tlb) 文件的新位置的引用。这至少看起来可以让我在“引用”框中创建一个新引用,但是在单击“确定”时,我收到一条消息“加载 DLL 时出错”
【问题讨论】:
-
您为什么要首先手动执行此操作?为什么不使用 clickonce 或其他应用程序部署加载项?最好的方法是为您的加载项创建一个安装程序,以便可以轻松卸载它,而无需您每次都手动执行此操作。
-
我的应用程序是用 VBA 编写的,大量使用 Excel API。它利用多个电子表格、一个 Access 数据库和一些外部库(一些是我开发的,另一些是商业产品)。它由数百个 VBA 宏和数万行代码组成,代表了许多人年的努力。它一直是我的退休项目,用于协助管理我的财务和投资,尚未开发为商业产品。 79 岁的我不希望在另一个平台上重新开发。
-
Broken references 可能不会返回名称,请添加对
.IsBroken的检查。您使用Regsvr32删除dll? -
我无法检查 .IsBroken 因为引用不再在 Application.Workbooks("fiskAIWkBook.xlam").VBProject.References 中。我没有使用 Regsvr32 来删除 dll。我只是从存储它们的文件夹中删除了 .dll、.pdb 和 .tlb 文件。
-
VBProject.References不包含引用,因为oReference.name不显示其名称?你不能相信那个。要将 .Net 程序集与 COM-Client (Office) 一起使用,需要使用 Regasm.exe 注册。尝试取消注册,然后重新注册您的程序集。