. .netmodule 링커 입력으로 파일
link.exe MSIL .obj
및 .netmodule
파일을 입력으로 허용합니다. 링커에서 생성된 출력 파일은 링커에 입력된 파일 또는 .netmodule
파일에 대한 런타임 종속성이 .obj
없는 어셈블리 또는 .netmodule
파일입니다.
설명
.netmodule
파일은 /LN을 사용하여 MSVC 컴파일러(MSIL 모듈 만들기) 또는 /NOASSEMBLY(MSIL 모듈 만들기)가 있는 링커에 의해 생성됩니다. .obj
파일은 항상 C++ 컴파일에서 만들어집니다. 다른 Visual Studio 컴파일러의 경우 /target: module 컴파일러 옵션을 사용합니다.
링커는 해당 파일을 만든 .netmodule
C++ 컴파일에서 전달 .obj
해야 합니다. .netmodule
/: 및 /clrclr:safepure 컴파일러 옵션은 Visual Studio 2015에서 더 이상 사용되지 않으며 Visual Studio 2017 이상에서는 지원되지 않으므로 전달이 더 이상 지원되지 않습니다.
명령줄에서 링커를 호출하는 방법에 대한 자세한 내용은 링커 명령줄 구문을 참조하고 명령줄에서 MSVC 도구 집합을 사용합니다.
.netmodule
MSVC 컴파일러에서 컴파일한 링커에 /clr를 사용하여 또는 .dll
파일을 전달하면 링커 오류가 발생할 수 있습니다. 자세한 내용은 .netmodule 입력 파일의 형식 선택을 참조하세요.
링커는 /clr로 컴파일된 네이티브 .obj
파일과 MSIL .obj
파일을 모두 허용합니다. 동일한 빌드에서 혼합 .obj
파일을 전달할 수 있습니다. 결과 출력 파일의 기본 확인 가능성은 가장 낮은 입력 모듈의 확인 가능성과 동일합니다.
둘 이상의 어셈블리로 구성된 애플리케이션을 한 어셈블리에 포함하도록 변경할 수 있습니다. 어셈블리의 원본을 다시 컴파일한 다음 파일 또는 .netmodule
파일을 연결 .obj
하여 단일 어셈블리를 생성합니다.
실행 파일을 만들 때 /ENTRY(진입점 기호)을 사용하여 진입점을 지정합니다.
MSIL .obj
또는 .netmodule
파일과 연결할 때 /LTCG(링크 시간 코드 생성)를 사용합니다. 그렇지 않으면 링커가 MSIL .obj
을 발견하거나 .netmodule
/LTCG를 사용하여 링크를 다시 시작합니다. 링크가 다시 시작되고 있다는 정보 메시지가 표시됩니다. 이 메시지를 무시할 수 있지만 링커 성능을 향상시키려면 /LTCG를 명시적으로 지정합니다.
MSIL .obj
또는 .netmodule
파일을 cl.exe 전달할 수도 있습니다.
입력 MSIL .obj
또는 .netmodule
파일에 포함된 리소스가 있을 수 없습니다. /ASSEMBLYRESOURCE(관리되는 리소스 포함) 링커 옵션을 사용하여 출력 모듈 또는 어셈블리 파일에 리소스를 포함합니다. 또는 다른 Visual Studio 컴파일러에서 /resource 컴파일러 옵션을 사용합니다.
예제
C++ 코드에서는 예외가 catch
아닌 경우 해당 try
블록이System
호출됩니다. 그러나 기본적으로 예외가 CLRSystem
아닌 경우를 으로 RuntimeWrappedException래핑합니다. C++ 및 비 C++ 모듈에서 어셈블리를 만들고 블록이 예외가 아닌 경우 해당 try
절에서 C++ 코드의 블록을System
호출하려는 catch
경우 비 C++ 모듈의 소스 코드에 특성을 추가 [assembly:System::Runtime::CompilerServices::RuntimeCompatibility(WrapNonExceptionThrows=false)]
해야 try
합니다.
// 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();
}
*/
특성 값을 Boolean
WrapNonExceptionThrows
변경하여 예외가 아닌System
항목을 catch하도록 C++ 코드의 기능을 수정합니다.
// 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