다음 옵션은 컴파일러 입력을 제어합니다. 새 MSBuild 구문은 굵게 표시됩니다. 이전 csc.exe 구문은 code style에 표시됩니다.
-
참조 /
-reference또는-references: 지정된 어셈블리 파일 또는 파일에서 메타데이터를 참조합니다. -
AddModules /
-addmodule: 모듈을 추가합니다(이 어셈블리에target:module생성됨). -
EmbedInteropTypes: 지정된 interop 어셈블리 파일의 메타데이터를 포함합니다 /
-link.
참고문헌
참조 옵션을 사용하면 컴파일러가 지정된 파일의 공용 형식 정보를 현재 프로젝트로 가져와 지정된 어셈블리 파일에서 메타데이터를 참조할 수 있습니다.
<Reference Include="filename" />
filename 는 어셈블리 매니페스트를 포함하는 파일의 이름입니다. 둘 이상의 파일을 가져오려면 각 파일에 대해 별도의 Reference 요소를 포함합니다. 별칭을 Reference 요소의 자식 요소로 정의할 수 있습니다.
<Reference Include="filename.dll">
<Aliases>LS</Aliases>
</Reference>
이전 예제 LS 에서는 어셈블리 filename.dll모든 네임스페이스를 포함하는 루트 네임스페이스를 나타내는 유효한 C# 식별자입니다. 가져오는 파일에는 매니페스트가 포함되어야 합니다.
AdditionalLibPaths를 사용하여 하나 이상의 어셈블리 참조가 있는 디렉터리를 지정합니다.
AdditionalLibPaths 항목에서는 컴파일러가 어셈블리를 검색하는 디렉터리도 설명합니다. 컴파일러가 모듈이 아닌 어셈블리의 형식을 인식하려면 형식의 인스턴스를 정의하여 수행할 수 있는 형식을 강제로 확인해야 합니다. 컴파일러의 어셈블리에서 형식 이름을 확인하는 다른 방법이 있습니다. 예를 들어 어셈블리의 형식에서 상속하는 경우 컴파일러에서 형식 이름을 인식합니다. 경우에 따라 한 어셈블리 내에서 동일한 구성 요소의 서로 다른 두 버전을 참조해야 합니다. 이렇게 하려면 각 파일에 대해 References 요소의 Aliases 요소를 사용하여 두 파일을 구분합니다. 이 별칭은 구성 요소 이름의 한정자로 사용되며 파일 중 하나의 구성 요소로 확인됩니다.
비고
Visual Studio에서 참조 추가 명령을 사용합니다. 자세한 내용은 방법: 참조 관리자를 사용하여 참조 추가 또는 제거를 참조하세요.
AddModules
이 옵션은 스위치를 사용하여 만든 모듈을 <OutputType>module</OutputType> 현재 컴파일에 추가합니다.
<AddModule Include=file1 />
<AddModule Include=file2 />
file 여기서file2는 메타데이터를 포함하는 출력 파일입니다. 파일에 어셈블리 매니페스트를 포함할 수 없습니다. 둘 이상의 파일을 가져오려면 파일 이름을 쉼표 또는 세미콜론으로 구분합니다.
AddModules를 사용하여 추가된 모든 모듈은 런타임에 출력 파일과 동일한 디렉터리에 있어야 합니다. 즉, 컴파일 시간에 모든 디렉터리에서 모듈을 지정할 수 있지만 모듈은 런타임에 애플리케이션 디렉터리에 있어야 합니다. 모듈이 런타임 TypeLoadException에 애플리케이션 디렉터리에 없는 경우 .
file 어셈블리를 포함할 수 없습니다. 예를 들어 출력 파일이 모듈의 OutputType 옵션을 사용하여 만들어진 경우 AddModules를 사용하여 해당 메타데이터를 가져올 수 있습니다.
출력 파일을 모듈 이외의 OutputType 옵션으로 만든 경우 해당 메타데이터를 AddModules로 가져올 수 없지만 참조 옵션을 사용하여 가져올 수 있습니다.
EmbedInteropTypes
컴파일러가 지정된 어셈블리의 COM 형식 정보를 현재 컴파일 중인 프로젝트에서 사용할 수 있도록 합니다.
<References>
<EmbedInteropTypes>file1;file2;file3</EmbedInteropTypes>
</References>
어셈블리 파일 이름의 세미콜론으로 구분된 목록은 어디에 file1;file2;file3 있습니다. 파일 이름에 공백이 있는 경우 이름을 따옴표로 묶습니다.
EmbedInteropTypes 옵션을 사용하면 포함된 형식 정보가 있는 애플리케이션을 배포할 수 있습니다. 그런 다음 애플리케이션은 런타임 어셈블리에 대한 참조 없이 포함된 형식 정보를 구현하는 런타임 어셈블리의 형식을 사용할 수 있습니다. 다양한 버전의 런타임 어셈블리가 게시되면 포함된 형식 정보가 포함된 애플리케이션은 다시 컴파일하지 않고도 다양한 버전에서 작동할 수 있습니다. 예를 들어 연습 : 관리되는 어셈블리에서 형식 포함을 참조하세요.
EmbedInteropTypes 옵션을 사용하는 것은 COM interop로 작업할 때 특히 유용합니다. 애플리케이션에 대상 컴퓨터에 PIA(기본 interop 어셈블리)가 더 이상 필요하지 않도록 COM 형식을 포함할 수 있습니다. EmbedInteropTypes 옵션은 참조된 interop 어셈블리의 COM 형식 정보를 결과 컴파일된 코드에 포함하도록 컴파일러에 지시합니다. COM 형식은 CLSID(GUID) 값으로 식별됩니다. 결과적으로 애플리케이션은 CLSID 값이 동일한 동일한 COM 형식을 설치한 대상 컴퓨터에서 실행할 수 있습니다. Microsoft Office를 자동화하는 애플리케이션이 좋은 예입니다. Office와 같은 애플리케이션은 일반적으로 서로 다른 버전에서 동일한 CLSID 값을 유지하므로 .NET Framework 4 이상이 대상 컴퓨터에 설치되고 애플리케이션에서 참조된 COM 형식에 포함된 메서드, 속성 또는 이벤트를 사용하는 한 애플리케이션에서 참조된 COM 형식을 사용할 수 있습니다. EmbedInteropTypes 옵션은 인터페이스, 구조체 및 대리자만 포함합니다. COM 클래스 포함은 지원되지 않습니다.
비고
코드에 포함된 COM 형식의 인스턴스를 만들 때 적절한 인터페이스를 사용하여 인스턴스를 만들어야 합니다. CoClass를 사용하여 포함된 COM 형식의 인스턴스를 만들려고 하면 오류가 발생합니다.
References 컴파일러 옵션과 마찬가지로 EmbedInteropTypes 컴파일러 옵션은 자주 사용되는 .NET 어셈블리를 참조하는 Csc.rsp 응답 파일을 사용합니다. 컴파일러에서 Csc.rsp 파일을 사용하지 않으려면 NoConfig 컴파일러 옵션을 사용합니다.
// The following code causes an error if ISampleInterface is an embedded interop type.
ISampleInterface<SampleType> sample;
interop 어셈블리에서 포함된 제네릭 매개 변수가 있는 형식은 외부 어셈블리의 형식인 경우 사용할 수 없습니다. 이 제한은 인터페이스에 적용되지 않습니다. 예를 들어 어셈블리에 Range 정의된 인터페이스를 고려합니다 Microsoft.Office.Interop.Excel . 라이브러리가 어셈블리의 Microsoft.Office.Interop.Excel interop 형식을 포함하고 해당 형식이 인터페이스인 매개 변수가 있는 제네릭 형식을 반환하는 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();
}
}
.NET