🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# /link (C# Compiler Options) 使编译器将指定程序集中的 COM 类型信息提供给当前正在编译的项目使用。 ## 语法 ``` /link:fileList // -or- /l:fileList ``` ## 参数 _fileList_ 必选。程序集文件名的逗号分隔列表。如果文件名包含空格,则将该文件名置于引号中。 ## 备注 通过 **/link** 选项,可以部署包含嵌入类型信息的应用程序。这样,该应用程序无需引用运行时程序集,就可以使用运行时程序集中实现嵌入类型信息的类型。如果发布了各种版本的运行时程序集,则包含嵌入类型信息的应用程序可以使用各种版本,而不必重新编译。有关示例,请参见[演练:嵌入托管程序集中的类型(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-cn/library/dd409610.aspx)。 当使用 COM 互操作时,使用 **/link** 选项尤为有用。通过嵌入 COM 类型,您的应用程序不再要求目标计算机上存在主互操作程序集 (PIA)。 **/link** 选项指示编译器将所引用的互操作程序集中的 COM 类型信息嵌入到所生成的编译代码中。该 COM 类型由 CLSID (GUID) 值标识。因此,您的应用程序可以在安装有 CLSID 值相同的相同 COM 类型的目标计算机上运行。自动执行 Microsoft Office 的应用程序就是一个很好的示例。由于诸如 Office 之类的应用程序通常在不同的版本中保留相同的 CLSID 值,因此只要目标计算机上安装有 .NET Framework 4 或更高版本,的应用程序就可以使用所引用的 COM 类型,并使用包含在所引用 COM 类型中的方法、属性或事件。 **/link** 选项仅嵌入接口、结构和委托。不支持嵌入 COM 类。 | ![](https://box.kancloud.cn/2016-01-31_56adb62c1380a.jpg) 注意 | | :-- | | 当在代码中创建嵌入 COM 类型的实例时,必须使用适当的接口创建该实例。如果尝试使用 CoClass 创建嵌入 COM 类型的实例,则会导致错误。 | 若要在 Visual Studio 中设置 **/link** 选项,请添加程序集引用并将 **Embed Interop Types** 属性设置为 **true**。 **Embed Interop Types** 属性的默认值为 **false**。 如果链接至一个 COM 程序集(程序集 A),而其本身又引用另一个 COM 程序集(程序集 B),则在符合下列任一条件的情况下也必须链接至程序集 B: * 程序集 A 中的类型继承自程序集 B 中的类型或实现程序集 B 中的接口。 * 调用具有程序集 B 中的返回类型或参数类型的字段、属性、事件或方法。 与 [/reference](https://msdn.microsoft.com/zh-cn/library/yabyz3h4.aspx) 编译器选项类似,**/link** 编译器选项使用 Csc.rsp 响应文件,该文件引用经常用到的 .NET Framework 程序集。如果希望编译器不要使用 Csc.rsp 文件,请使用 [/noconfig](https://msdn.microsoft.com/zh-cn/library/8hww4s6c.aspx) 编译器选项。 **/link** 的缩写形式是 **/l**。 ## 泛型和嵌入类型 以下各节介绍在嵌入互操作类型的应用程序中使用泛型类型时所存在的限制。 ### 泛型接口 不能使用从互操作程序集中嵌入的泛型接口。这将在下面的示例中显示。 ``` // The following code causes an error if ISampleInterface is an embedded interop type. ISampleInterface<SampleType> sample; ``` ### 具有泛型参数的类型 对于具有泛型参数并且该参数类型是从互操作程序集嵌入的类型,如果该类型来自外部程序集,则不能使用该类型。此限制不适用于接口。例如,请考虑在 [Microsoft.Office.Interop.Excel](https://msdn.microsoft.com/zh-cn/library/microsoft.office.interop.excel.aspx) 程序集中定义的 [Range](https://msdn.microsoft.com/zh-cn/library/microsoft.office.interop.excel.range.aspx) 接口。如果库从 [Microsoft.Office.Interop.Excel](https://msdn.microsoft.com/zh-cn/library/microsoft.office.interop.excel.aspx) 程序集嵌入互操作类型并公开一个返回泛型类型的方法,该泛型类型的参数类型为 [Range](https://msdn.microsoft.com/zh-cn/library/microsoft.office.interop.excel.range.aspx) 接口,则该方法必须返回一个泛型接口,如下面的代码示例中所示。 ``` 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](https://msdn.microsoft.com/zh-cn/library/system.collections.ilist.aspx) 泛型接口的方法。 ``` 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](https://msdn.microsoft.com/zh-cn/library/2fdbz5xd.aspx) [演练:嵌入托管程序集中的类型(C# 和 Visual Basic)](https://msdn.microsoft.com/zh-cn/library/dd409610.aspx) [/reference (C# Compiler Options)](https://msdn.microsoft.com/zh-cn/library/yabyz3h4.aspx) [/noconfig (C# Compiler Options)](https://msdn.microsoft.com/zh-cn/library/8hww4s6c.aspx) [Command-line Building With csc.exe](https://msdn.microsoft.com/zh-cn/library/78f4aasd.aspx) [互操作性概述(C# 编程指南)](https://msdn.microsoft.com/zh-cn/library/ms173185.aspx)