링커 입력 파일로 사용하는 .netmodule 파일
업데이트: 2007년 11월
이제는 MSIL .obj 및 .netmodule을 link.exe에 대한 입력으로 사용할 수 있습니다. 링커에서 생성되는 출력 파일은 링커의 입력으로 사용된 .obj 또는 .netmodule에 대한 런타임 종속성이 없는 어셈블리 또는 .netmodule입니다.
.netmodule은 Visual C++ 컴파일러에서 /LN(MSIL 모듈 만들기)을 사용하여 만들거나 링커에서 /NOASSEMBLY(MSIL 모듈 만들기)를 사용하여 만듭니다. .obj는 항상 Visual C++ 컴파일을 통해 만들어집니다. 다른 Visual Studio 컴파일러의 경우에는 /target:module 컴파일러 옵션을 사용합니다.
/clr(공용 언어 런타임 컴파일)를 사용하여 .netmodule을 만들지 않는 한 대부분의 경우에는 .netmodule을 만든 Visual C++ 컴파일의 .obj 파일을 링커에 전달해야 합니다. 링커에 대한 입력으로 사용되는 MSIL .netmodule은 Visual C++ 컴파일러에서 /clr:safe를 사용하여 만들 수 있는 순수 MSIL이어야 합니다. 다른 Visual Studio 컴파일러에서는 기본적으로 순수 MSIL 모듈을 생성합니다.
명령줄에서 링커를 실행하는 방법에 대한 자세한 내용은 링커 명령줄 구문 및 명령줄 빌드를 위한 경로 및 환경 변수 설정을 참조하십시오.
Visual C++ 컴파일러에서 /clr 또는 /clr:pure를 사용하여 컴파일한 .netmodule 또는 .dll 파일을 링커에 전달하면 링커 오류가 발생할 수 있습니다. 자세한 내용은 .netmodule 입력 파일 형식 선택을 참조하십시오.
링커에서는 /clr, /clr:pure 또는 /clr:safe를 사용하여 컴파일된 MSIL .obj 파일 및 네이티브 .obj 파일을 입력으로 사용합니다. 동일한 빌드에서 혼합 .obj를 전달하면 결과 출력 파일의 확인 가능성은 기본적으로 입력 모듈의 최하위 확인 가능성과 동일해집니다. 예를 들어, 링커에 안전하고 순수한 .obj를 전달하면 출력 파일은 순수해집니다. 필요한 경우 /CLRIMAGETYPE(CLR 이미지 형식 지정)을 사용하여 하위 확인 가능성을 지정할 수 있습니다.
현재 여러 개의 어셈블리로 구성된 응용 프로그램이 있고, 하나의 어셈블리에 응용 프로그램을 포함시키려면 어셈블리를 다시 컴파일한 다음 .obj 또는 .netmodule을 링크하여 하나의 어셈블리를 생성해야 합니다.
실행 가능 이미지를 만들 때는 /ENTRY(진입점 기호)를 사용하여 진입점을 지정해야 합니다.
MSIL .obj 또는 .netmodule 파일로 링크하는 경우에는 /LTCG(링크 타임 코드 생성)를 사용합니다. 그렇지 않으면 링커가 MSIL .obj 또는 .netmodule을 발견할 때 /LTCG를 사용하여 링크를 다시 시작합니다.
MSIL .obj 또는 .netmodule 파일을 cl.exe에 전달할 수도 있습니다.
입력되는 MSIL .obj 또는 .netmodule 파일은 포함 리소스를 가질 수 없습니다. 리소스는 /ASSEMBLYRESOURCE(관리되는 리소스 포함) 링커 옵션을 사용하거나 다른 Visual Studio 컴파일러에서 /resource 컴파일러 옵션을 사용하여 출력 파일(모듈 또는 어셈블리)에 포함됩니다.
MSIL 링크를 수행하는 경우 /LTCG(링크 타임 코드 생성)를 지정하지 않으면 링크를 다시 시작한다는 정보 메시지가 표시됩니다. 이 메시지는 무시할 수 있으나, MSIL 링크에서 링커 성능을 향상시키려면 명시적으로 /LTCG를 지정하는 것이 좋습니다.
예제
C++ 코드에서는 시스템 예외가 아닌 예외의 경우 해당 try의 catch 블록이 호출됩니다. 그러나 CLR에서는 기본적으로 시스템 예외가 아닌 예외를 RuntimeWrappedException으로 래핑합니다. Visual C++ 및 Visual C++가 아닌 모듈로 어셈블리를 만든 경우 try 블록에서 시스템 예외가 아닌 예외를 throw할 때 이 try 절에서 C++ 코드의 catch 블록을 호출하도록 하려면 C++가 아닌 모듈의 소스 코드에 다음 특성을 추가해야 합니다.
[assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)]
// MSIL_linking.cpp
// compile with: /c /clr
value struct V {};
ref struct MCPP {
static void Test() {
try {
throw (gcnew V);
}
catch (V ^) {
System::Console::WriteLine("caught non System exception in C++ source code file");
}
}
};
/*
int main() {
MCPP::Test();
}
*/
WrapNonExceptionThrows 특성의 부울 값을 변경하면 Visual C++ 코드에서 시스템 예외가 아닌 예외를 catch할 수 있는지 여부가 수정됩니다.
// MSIL_linking_2.cs
// compile with: /target:module /addmodule:MSIL_linking.obj
// post-build command: link /LTCG MSIL_linking.obj MSIL_linking_2.netmodule /entry:MLinkTest.Main /out:MSIL_linking_2.exe /subsystem:console
using System.Runtime.CompilerServices;
// enable non System exceptions
[assembly:RuntimeCompatibility(WrapNonExceptionThrows=false)]
class MLinkTest {
public static void Main() {
try {
MCPP.Test();
}
catch (RuntimeWrappedException) {
System.Console.WriteLine("caught a wrapped exception in C#");
}
}
}
caught non System exception in C++ source code file