Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Следующие параметры управляют входными данными компилятора. Новый синтаксис 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();
}
}