Как добавить / удалить ссылку программно? - PullRequest
8 голосов
/ 27 февраля 2009

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

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

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

Ответы [ 2 ]

10 голосов
/ 27 февраля 2009

Вот пример кода:

Создать ссылку из файла

  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

4 голосов
/ 28 февраля 2009

Лучшее решение - ограничить ссылки в вашей 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 просто ломается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...