Поделиться через


Параметры компилятора C#, указывающие входные данные

Следующие параметры управляют входными данными компилятора. Новый синтаксис MSBuild выделен полужирным шрифтом. Для старого синтаксиса csc.exe используется формат code style.

  • Ссылки / -reference или -references: ссылки на метаданные из указанного файла сборки или файлов.
  • AddModules / -addmodule: добавление модуля (созданного с target:module помощью этой сборки.)
  • EmbedInteropTypes / -link: внедрение метаданных из указанных файлов сборок взаимодействия.

Ссылки

Параметр "Ссылки" приводит к импорту сведений о общедоступном типе в указанном файле в текущий проект, что позволяет ссылаться на метаданные из указанных файлов сборок.

<Reference Include="filename" />

filename — это имя файла, содержащего манифест сборки. Чтобы импортировать несколько файлов, добавьте отдельный элемент Reference для каждого файла. Псевдоним можно определить как дочерний элемент элемента Reference :

<Reference Include="filename.dll">
  <Aliases>LS</Aliases>
</Reference>

В предыдущем примере является допустимым идентификатором C#, LS который представляет корневое пространство имен, которое будет содержать все пространства имен в сборкеfilename.dll. Импортируемые файлы должны содержать манифест. Используйте ДополнительныеLibPaths , чтобы указать каталог, в котором находится одна или несколько ссылок на сборку. В разделе AdditionalLibPaths также рассматриваются каталоги, в которых компилятор ищет сборки. Чтобы компилятор распознал тип в сборке, а не в модуле, необходимо принудительно разрешить тип, который можно сделать, определив экземпляр типа. Существуют другие способы разрешения имен типов в сборке компилятора: например, если вы наследуете тип в сборке, имя типа будет распознано компилятором. Иногда необходимо ссылаться на две разные версии одного компонента из одной сборки. Для этого используйте элемент Aliases в элементе References для каждого файла, чтобы различать два файла. Этот псевдоним будет использоваться в качестве квалификатора для имени компонента и будет разрешаться компоненту в одном из файлов.

Замечание

В Visual Studio используйте команду "Добавить ссылку ". Дополнительные сведения см. в разделе "Практическое руководство. Добавление или удаление ссылок с помощью диспетчера ссылок".

AddModules

Этот параметр добавляет модуль, созданный с <TargetType>module</TargetType> помощью переключателя в текущую компиляцию:

<AddModule Include=file1 />
<AddModule Include=file2 />

file2 Где file— выходные файлы, содержащие метаданные. Файл не может содержать манифест сборки. Чтобы импортировать несколько файлов, разделите имена файлов с запятой или точкой с запятой. Все модули, добавленные с помощью AddModules , должны находиться в том же каталоге, что и выходной файл во время выполнения. То есть можно указать модуль в любом каталоге во время компиляции, но модуль должен находиться в каталоге приложения во время выполнения. Если модуль не в каталоге приложений во время выполнения, вы получите TypeLoadException. file не может содержать сборку. Например, если выходной файл был создан с параметром TargetTypeмодуля, его метаданные можно импортировать с помощью AddModules.

Если выходной файл был создан с параметром TargetType , отличный от модуля, его метаданные нельзя импортировать с помощью AddModules , но можно импортировать с помощью параметра "Ссылки ".

EmbedInteropTypes

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

<References>
  <EmbedInteropTypes>file1;file2;file3</EmbedInteropTypes>
</References>

Где file1;file2;file3 находится список имен файлов сборки с запятой. Если имя файла содержит пробел, заключите имя в кавычки. Параметр EmbeddedInteropTypes позволяет развернуть приложение с внедренными сведениями о типе. Затем приложение может использовать типы в сборке среды выполнения, реализующей сведения о внедренном типе, не требуя ссылки на сборку среды выполнения. Если публикуются различные версии сборки среды выполнения, приложение, содержащее сведения о внедренных типах, может работать с различными версиями без необходимости перекомпилироваться. Пример см. в пошаговом руководстве. Внедрение типов из управляемых сборок.

Использование параметра EmbedInteropTypes особенно полезно при работе с COM-взаимодействием. Вы можете внедрить типы COM, чтобы приложение больше не требует основной сборки взаимодействия (PIA) на целевом компьютере. Параметр EmbedInteropTypes указывает компилятору внедрить сведения о типе COM из указанной сборки взаимодействия в результирующий скомпилированный код. Тип COM определяется значением CLSID (GUID). В результате приложение может работать на целевом компьютере, на котором установлены те же типы COM с теми же значениями CLSID. Приложения, автоматизирующие Microsoft Office, являются хорошим примером. Так как приложения, такие как Office, обычно сохраняют одно и то же значение CLSID в разных версиях, приложение может использовать ссылочные типы COM до тех пор, пока на целевом компьютере установлен .NET Framework 4 или более поздней версии, а приложение использует методы, свойства или события, включенные в ссылочные типы COM. Параметр EmbedInteropTypes внедряет только интерфейсы, структуры и делегаты. Внедрение классов COM не поддерживается.

Замечание

При создании экземпляра внедренного com-типа в коде необходимо создать экземпляр с помощью соответствующего интерфейса. Попытка создать экземпляр внедренного com-типа с помощью CoClass вызывает ошибку.

Как и параметр компилятора References , параметр компилятора EmbedInteropTypes использует файл ответа Csc.rsp, который ссылается на часто используемые сборки .NET. Используйте параметр компилятора NoConfig , если не хотите, чтобы компилятор использовал Csc.rsp-файл.

// 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()
    {
        return null;
    }

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

В следующем примере клиентский код может вызывать метод, возвращающий универсальный 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();
    }
}