Как программно добавить / удалить ссылку?
Мое приложение создано для сканирования базы данных MS Access в VB.NET.
Когда приложение Access распространяется среди конечных пользователей, они могут иметь разные версии COM-компонентов. Можно ли программно добавлять / удалять ссылки для устранения неработающих ссылок из-за разных версий?
Поделитесь, пожалуйста, кодом или ссылкой для справки.
Ответов (2)2
Вот пример кода:
Создать ссылку из файла
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
Вы также можете прочитать http://www.mvps.org/access/modules/mdl0022.htm
Лучшее решение - ограничить ссылки в вашем 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 просто ломается.