-link (Visual Basic)
Дает компилятору указание сделать всю информацию о типах COM из указанных сборок доступной компилируемому проекту.
Синтаксис
-link:fileList
or
-l:fileList
Аргументы
Термин | Определение |
---|---|
fileList |
Обязательный. Список всех имен файлов сборки, разделенных запятыми. Если имя файла содержит пробел, заключите его в кавычки. |
Замечания
Параметр -link
позволяет развернуть приложение, содержащее внедренные сведения о типе. После этого приложение может использовать типы из сборки среды выполнения, реализующей информацию о внедренных типах, без ссылки на эту сборку. Если опубликовано несколько версий сборки среды выполнения, приложение, содержащее сведения о внедренных типах, может работать с различными версиями без перекомпиляции. Пример см. в разделе Пошаговое руководство. Внедрение данных о типах из управляемых сборок.
Параметр -link
особенно полезен при работе с COM-взаимодействием. COM-типы внедряются для того, чтобы приложению не требовалась основная сборка взаимодействия (PIA) на целевом компьютере. Параметр -link
предписывает компилятору внедрить сведения о COM-типах из указанной сборки взаимодействия в полученный скомпилированный код. COM-тип определяется значением CLSID (GUID). Это позволяет запускать приложение на целевом компьютере, где установлены те же COM-типы с такими же значениями CLSID. В качестве примера можно привести приложения, автоматизирующие Microsoft Office. Поскольку в приложениях типа Office значение CLSID обычно не зависит от версии, ваше приложение сможет использовать COM-типы по ссылке до тех пора, пока на целевом компьютере установлена платформа .NET Framework 4 или более поздней версии, а приложение работает с методами, свойствами или событиями, включенными в эти COM-типы.
Параметр -link
внедряет только интерфейсы, структуры и делегаты. Внедрение COM-классов не поддерживается.
Примечание.
Если в коде создается экземпляр внедренного COM-типа, его следует создавать, используя соответствующий интерфейс. При попытке создать экземпляр внедренного COM-типа с помощью компонентного класса возникнет ошибка.
Чтобы задать параметр -link
в Visual Studio, добавьте ссылку на сборку и задайте для свойства Embed Interop Types
значение true. По умолчанию для свойства Embed Interop Types
задается значение false.
Ссылаясь на COM-сборку (сборку A), которая, в свою очередь, ссылается на другую COM-сборку (сборку Б), необходимо также добавить ссылку на сборку Б, если выполняется любое из следующих условий:
Тип из сборки A наследуется из типа или реализует интерфейс сборки Б.
Вызывается поле, свойство, событие или метод, имеющий тип возвращаемого значения или тип параметра из сборки Б.
Для указания каталога, в котором находятся одна или несколько ссылок на сборки, используется параметр -libpath.
Как и параметр компилятора -reference, параметр компилятора -link
использует файл ответов Vbc.rsp, который ссылается на часто используемые сборки .NET Framework. Если вы не хотите, чтобы компилятор использовал файл Vbc.rsp, примените параметр компилятора -noconfig.
Краткой формой -link
является -l
.
Универсальные и внедренные типы
В следующих разделах описаны ограничения на использование универсальных типов в приложениях с внедренными типами взаимодействия.
Универсальные интерфейсы
Использовать универсальные интерфейсы, внедренные из сборки взаимодействия, нельзя. Это показано в следующем примере.
' The following code causes an error if ISampleInterface is an embedded interop type.
Dim sample As ISampleInterface(Of SampleType)
Типы с универсальными параметрами
Типы с универсальным параметром, тип которого внедрен из сборки взаимодействия, нельзя использовать, если он относится к внешней сборке. Это ограничение не относится к интерфейсам. Например, рассмотрим интерфейс Range, который определен в сборке Microsoft.Office.Interop.Excel. Если библиотека содержит внедренные типы взаимодействия из сборки Microsoft.Office.Interop.Excel и предоставляет метод, возвращающий универсальный тип с параметром, типом которого является интерфейс Range, этот метод должен возвращать универсальный интерфейс, как показано в следующем примере кода.
Imports System.Collections.Generic
Imports Microsoft.Office.Interop.Excel
Class Utility
' The following code causes an error when called by a client assembly.
Public Function GetRange1() As List(Of Range)
End Function
' The following code is valid for calls from a client assembly.
Public Function GetRange2() As IList(Of Range)
End Function
End Class
В следующем примере клиентский код может вызывать метод, возвращающий универсальный интерфейс IList без ошибок.
Module Client
Public Sub Main()
Dim util As New Utility()
' The following code causes an error.
Dim rangeList1 As List(Of Range) = util.GetRange1()
' The following code is valid.
Dim rangeList2 As List(Of Range) = CType(util.GetRange2(), List(Of Range))
End Sub
End Module
Пример
Следующая команда компилирует исходный файл OfficeApp.vb
, ссылочные сборки из COMData1.dll
и COMData2.dll
, а также создает файл OfficeApp.exe
.
vbc -link:COMData1.dll,COMData2.dll -out:OfficeApp.exe OfficeApp.vb