我的应用程序是为VB.NET中的扫描MS Access数据库构建的。
当Access应用程序分发给最终用户时,它们可能具有不同版本的COM组件。是否可以通过编程方式添加/删除引用以解决由于版本不同而导致的损坏引用?
请与我分享代码或链接以供参考。
答案 0 :(得分:10)
以下是一些示例代码:
从文件创建参考
Sub AddWS()
'Create a reference to Windows Script Host, '
'where you will find FileSystemObject '
'Reference name: "IWshRuntimeLibrary" '
'Reference Name in references list: "Windows Script Host Object Model" '
ReferenceFromFile "C:\WINDOWS\System32\wshom.ocx"
End Sub
Function ReferenceFromFile(strFileName As String) As Boolean
Dim ref As Reference
On Error GoTo Error_ReferenceFromFile
References.AddFromFile (strFileName)
ReferenceFromFile = True
Exit_ReferenceFromFile:
Exit Function
Error_ReferenceFromFile:
ReferenceFromFile = False
Resume Exit_ReferenceFromFile
End Function
删除参考
Sub DeleteRef(RefName)
Dim ref As Reference
'You need a reference to remove '
Set ref = References(RefName)
References.Remove ref
End Sub
You can use the references collection to find if a reference exists.
参考文献
Function RefExists(RefName)
Dim ref As Object
RefExists = False
For Each ref In References
If ref.Name = RefName Then
RefExists = True
End If
Next
End Function
来自:http://wiki.lessthandot.com/index.php/Add,_Remove,_Check_References
答案 1 :(得分:4)
最佳解决方案是将Access MDB中的引用限制为内部Access组件。这将是Access引用,VBA引用和DAO引用。所有其他外部库应该通过后期绑定来使用。例如,如果您正在使用文件系统对象而不是此(引用Windows脚本宿主对象模型):
Dim objFSO As New FileSystemObject
If objFSO.FolderExists("\\d9m09521\WB\") Then
...
End If
你会删除引用并将其转换为:
Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists("\\d9m09521\WB\") Then
...
End If
如果您担心每次使用它时初始化FSO的性能损失,您可以缓存对它的引用。我通常在函数内部使用一个静态变量来返回一个这样的对象:
Public Function FSO() As Object
Static objFSO As Object
If objFSO Is Nothing Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
End If
FSO = objFSO
End Function
现在,您可能希望获得幻想并且还能够拆除实例化对象,在这种情况下,您可以执行以下操作:
Public Function FSO(Optional bolCloseObject As Boolean = False) As Object
Static objFSO As Object
If bolCloseObject Then
Set objFSO = Nothing
Exit Function
End If
If objFSO Is Nothing Then
Set objFSO = CreateObject("Scripting.FileSystemObject")
End If
FSO = objFSO
End Function
在任何情况下,重点是后期绑定在运行时解析外部库的位置,因此不会中断,除非未安装外部库或未正确注册。使用后期绑定,您可以捕获这两种情况,但是通过早期绑定,您的整个Access应用程序都会中断。