Share via


.netmodule 링커 입력으로 파일

link.exe는 MSIL .obj.netmodule 파일을 입력으로 허용합니다. 링커에서 생성된 출력 파일은 링커에 입력된 파일 또는 .netmodule 파일에 대한 런타임 종속성이 .obj 없는 어셈블리 또는 .netmodule 파일입니다.

설명

.netmodule파일은 /LN을 사용하여 MSVC 컴파일러(MSIL 모듈 만들기) 또는 /NOASSEMBLY(MSIL 모듈 만들기)가 있는 링커에 의해 생성됩니다. .obj 파일은 항상 C++ 컴파일에서 만들어집니다. 다른 Visual Studio 컴파일러의 경우 /target: module 컴파일러 옵션을 사용합니다.

링커는 해당 파일을 만든 .netmoduleC++ 컴파일에서 전달 .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 호출됩니다. 그러나 기본적으로 CLR은 예외가 아닌System 값을 으로 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();
}
*/

특성 값을 BooleanWrapNonExceptionThrows 변경하여 예외가 아닌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

참고 항목