Как программно добавить / удалить ссылку?

Мое приложение создано для сканирования базы данных MS Access в VB.NET.

Когда приложение Access распространяется среди конечных пользователей, они могут иметь разные версии COM-компонентов. Можно ли программно добавлять / удалять ссылки для устранения неработающих ссылок из-за разных версий?

Поделитесь, пожалуйста, кодом или ссылкой для справки.

Ответов (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 просто ломается.