-link (Visual Basic)

使编译器使指定程序集中的 COM 类型信息可用于当前正在编译的项目。

语法

-link:fileList  

-l:fileList  

论据

术语 定义
fileList 必填。 程序集文件名的逗号分隔列表。 如果文件名包含空格,请将名称用引号引起来。

注解

使用 -link 此选项可以部署具有嵌入类型信息的应用程序。 然后,应用程序可以使用运行时程序集中的类型来实现嵌入类型信息,而无需引用运行时程序集。 如果发布各种版本的运行时程序集,则包含嵌入类型信息的应用程序可以处理各种版本,而无需重新编译。 有关示例,请参阅 演练:从托管程序集嵌入类型

使用此选项 -link 在处理 COM 互作时特别有用。 可以嵌入 COM 类型,以便应用程序不再需要目标计算机上的主互作程序集 (PIA)。 该 -link 选项指示编译器将引用的互作程序集中的 COM 类型信息嵌入到生成的已编译代码中。 COM 类型由 CLSID (GUID) 值标识。 因此,应用程序可以在安装了具有相同 CLSID 值的相同 COM 类型的目标计算机上运行。 自动Microsoft Office 的应用程序是一个很好的示例。 由于 Office 等应用程序通常在不同的版本中保留相同的 CLSID 值,因此应用程序可以使用引用的 COM 类型,前提是目标计算机上安装了 .NET Framework 4 或更高版本,并且应用程序使用引用的 COM 类型中包含的方法、属性或事件。

-link 选项仅嵌入接口、结构和委托。 不支持嵌入 COM 类。

注释

在代码中创建嵌入式 COM 类型的实例时,必须使用相应的接口创建实例。 尝试使用 CoClass 创建嵌入 COM 类型的实例会导致错误。

若要在 Visual Studio 中设置 -link 选项,请添加程序集引用并将 Embed Interop Types 属性设置为 true。 属性的 Embed Interop Types 默认值为 false

如果链接到引用另一个 COM 程序集(程序集 B)的 COM 程序集(程序集 A),则如果下列任一项为 true,则还必须链接到程序集 B:

  • 程序集 A 中的类型继承自类型或实现程序集 B 中的接口。

  • 调用程序集 B 中具有返回类型或参数类型的字段、属性、事件或方法。

使用 -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和引用程序集以及COMData2.dll生成COMData1.dllOfficeApp.exe程序集。

vbc -link:COMData1.dll,COMData2.dll -out:OfficeApp.exe OfficeApp.vb  

另请参阅