/link (C# Compiler Options)

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

语法

/link:fileList
// -or-
/l:fileList

参数

fileList

必选。程序集文件名的逗号分隔列表。如果文件名包含空格,则将该文件名置于引号中。

备注

通过 /link 选项,可以部署包含嵌入类型信息的应用程序。这样,该应用程序无需引用运行时程序集,就可以使用运行时程序集中实现嵌入类型信息的类型。如果发布了各种版本的运行时程序集,则包含嵌入类型信息的应用程序可以使用各种版本,而不必重新编译。有关示例,请参见演练:嵌入托管程序集中的类型(C# 和 Visual Basic)

当使用 COM 互操作时,使用 /link 选项尤为有用。通过嵌入 COM 类型,您的应用程序不再要求目标计算机上存在主互操作程序集 (PIA)。 /link 选项指示编译器将所引用的互操作程序集中的 COM 类型信息嵌入到所生成的编译代码中。该 COM 类型由 CLSID (GUID) 值标识。因此,您的应用程序可以在安装有 CLSID 值相同的相同 COM 类型的目标计算机上运行。自动执行 Microsoft Office 的应用程序就是一个很好的示例。由于诸如 Office 之类的应用程序通常在不同的版本中保留相同的 CLSID 值,因此只要目标计算机上安装有 .NET Framework 4 或更高版本,的应用程序就可以使用所引用的 COM 类型,并使用包含在所引用 COM 类型中的方法、属性或事件。

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

注意
当在代码中创建嵌入 COM 类型的实例时,必须使用适当的接口创建该实例。如果尝试使用 CoClass 创建嵌入 COM 类型的实例,则会导致错误。

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

如果链接至一个 COM 程序集(程序集 A),而其本身又引用另一个 COM 程序集(程序集 B),则在符合下列任一条件的情况下也必须链接至程序集 B:

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

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

/reference 编译器选项类似,/link 编译器选项使用 Csc.rsp 响应文件,该文件引用经常用到的 .NET Framework 程序集。如果希望编译器不要使用 Csc.rsp 文件,请使用 /noconfig 编译器选项。

/link 的缩写形式是 /l

泛型和嵌入类型

以下各节介绍在嵌入互操作类型的应用程序中使用泛型类型时所存在的限制。

泛型接口

不能使用从互操作程序集中嵌入的泛型接口。这将在下面的示例中显示。

// The following code causes an error if ISampleInterface is an embedded interop type.
ISampleInterface<SampleType> sample;

具有泛型参数的类型

对于具有泛型参数并且该参数类型是从互操作程序集嵌入的类型,如果该类型来自外部程序集,则不能使用该类型。此限制不适用于接口。例如,请考虑在 Microsoft.Office.Interop.Excel 程序集中定义的 Range 接口。如果库从 Microsoft.Office.Interop.Excel 程序集嵌入互操作类型并公开一个返回泛型类型的方法,该泛型类型的参数类型为 Range 接口,则该方法必须返回一个泛型接口,如下面的代码示例中所示。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Excel;

public class Utility
{
    // The following code causes an error when called by a client assembly.
    public List<Range> GetRange1() {
}

// The following code is valid for calls from a client assembly.
public IList<Range> GetRange2() {
    }
}

在下面的示例中,客户端代码可调用在不出错的情况下返回 IList 泛型接口的方法。

public class Client
{
    public void Main()
    {
        Utility util = new Utility();

        // The following code causes an error.
        List<Range> rangeList1 = util.GetRange1();

        // The following code is valid.
        List<Range> rangeList2 = (List<Range>)util.GetRange2();
    }
}

下面的代码编译源文件 OfficeApp.cs 并引用 COMData1.dll 和 COMData2.dll 中的程序集来生成 OfficeApp.exe。

csc /link:COMData1.dll,COMData2.dll /out:OfficeApp.exe OfficeApp.cs

请参阅

C# Compiler Options

演练:嵌入托管程序集中的类型(C# 和 Visual Basic)

/reference (C# Compiler Options)

/noconfig (C# Compiler Options)

Command-line Building With csc.exe

互操作性概述(C# 编程指南)