/link (параметры компилятора C#)

Указывает компилятору сделать доступными для текущего компилируемого проекта сведения о типах COM, находящихся в указанных сборках.

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

Аргументы

  • fileList
    Обязательный. Список имен файлов сборки с элементами отделенными между собой запятыми. Заключите имя файла в кавычки (""), если оно содержит пробел.

Заметки

Параметр /link позволяет развернуть приложение, содержащее внедренные сведения о типах. Такое приложение может использовать типы в сборке среды выполнения, реализующие внедренные сведения о типах, без необходимости ссылаться на сборку среды выполнения. Если опубликовано несколько версий сборки среды выполнения, приложение, содержащее внедренные сведения о типах, может работать с различными версиями без перекомпиляции. Пример см. в разделе Пошаговое руководство. Внедрение данных о типах из управляемых сборок (C# и Visual Basic).

Применение параметра /link особенно полезно при работе с COM-взаимодействием. Типы COM можно сделать внедренными, и приложение более не будет нуждаться в основной сборке взаимодействия (primary interop assembly — 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 тип наследуется от типа или реализует интерфейс из сборки Б.

  • Вызывается поле, свойство, событие или метод, который возвращает из сборки Б тип или параметр типа.

Подобно параметру компилятора /reference параметр компилятора /link использует файл ответов Csc.rsp, который ссылается на часто используемые сборки .NET Framework. Параметр компилятора /noconfig позволяет запретить компилятору использовать файл Csc.rsp.

Сокращенная форма /link — /l.

Универсальные и внедренные типы

В последующих разделах описываются ограничения на использование универсальных типов в приложениях с внедренными типами взаимодействия.

Универсальные интерфейсы

Универсальные интерфейсы, внедренные из сборки взаимодействия, использовать невозможно. Это показано в следующем примере.

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

Типы с универсальными параметрами

Типы с универсальным параметром, тип которого внедрен из сборки взаимодействия, использовать невозможно, если это тип из внешней сборки. Это ограничение не распространяется на интерфейсы. Например, рассмотрим интерфейс Range, определенный в сборке Microsoft.Office.Interop.Excel. Если библиотека содержит внедренные типы из 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# и Visual Basic)

Ссылки

/reference (параметры компилятора C#)

/noconfig (параметры компилятора C#)

Общие сведения о взаимодействии. (Руководство по программированию в C#)

Основные понятия

Построение из командной строки с помощью csc.exe

Другие ресурсы

Параметры компилятора C#