디버그 및 릴리스 구성이 완전히 다르므로 대상 플랫폼에서 유니버설 Windows 플랫폼 앱의 릴리스 빌드를 테스트하는 것이 중요합니다. 기본적으로 디버그 구성은 .NET Core 런타임을 사용하여 앱을 컴파일하지만 릴리스 구성은 .NET 네이티브를 사용하여 앱을 네이티브 코드로 컴파일합니다.
중요합니다
MissingMetadataException, MissingInteropDataException, 및 MissingRuntimeArtifactException 예외를 처리하는 방법에 대한 정보는 앱의 릴리스 버전을 테스트할 때 접할 수 있는 예외를 포함하여 다음을 참조하세요: "단계 4: 누락된 메타데이터를 수동으로 해결하기"에 대한 내용은 "시작하기" 항목뿐만 아니라 "리플렉션과 .NET 네이티브" 및 "런타임 지시문(rd.xml) 구성 파일 참조"도 참조하세요.
디버그 및 릴리스 빌드
디버그 빌드가 .NET Core 런타임에 대해 실행되는 경우 네이티브 코드로 컴파일되지 않았습니다. 이렇게 하면 일반적으로 런타임에서 제공하는 모든 서비스를 앱에서 사용할 수 있습니다.
반면, 릴리스 빌드는 대상 플랫폼에 대한 네이티브 코드로 컴파일되고, 외부 런타임 및 라이브러리에 대한 대부분의 종속성을 제거하고, 최대 성능을 위해 코드를 크게 최적화합니다.
.NET 네이티브를 사용하여 컴파일된 릴리스 빌드를 디버그하는 경우:
일반 .NET 디버깅 도구와 다른 .NET 네이티브 디버그 엔진을 사용합니다.
실행 파일의 크기가 최대한 줄어듭니다. .NET 네이티브가 실행 파일의 크기를 줄이는 방법 중 하나는 런타임 예외 메시지를 크게 트리밍하는 것입니다. 이 항목은 런타임 예외 메시지 섹션에서 자세히 설명합니다.
코드가 크게 최적화되어 있습니다. 즉, 인라인 처리는 가능할 때마다 사용됩니다. (인라인 처리는 외부 루틴에서 호출 루틴으로 코드를 이동합니다.) .NET 네이티브가 특수 런타임을 제공하고 공격적인 인라인을 구현한다는 사실은 디버깅할 때 표시되는 호출 스택에 영향을 줍니다. 자세한 내용은 런타임 호출 스택 섹션을 참조하세요.
비고
.NET 네이티브 도구 체인 상자를 사용하여
런타임 예외 메시지
애플리케이션 실행 파일 크기를 최소화하기 위해 .NET Native에는 예외 메시지의 전체 텍스트가 포함되지 않습니다. 따라서 릴리스 빌드에서 throw된 런타임 예외는 예외 메시지의 전체 텍스트를 표시하지 않을 수 있습니다. 대신 텍스트는 추가 정보를 위해 따라야 할 링크와 함께 부분 문자열로 구성됩니다. 예를 들어 예외 정보는 다음과 같이 나타날 수 있습니다.
Exception thrown: '$16_System.AggregateException' in Unknown Module.
Additional information: AggregateException_ctor_DefaultMessage
If there is a handler for this exception, the program may be safely continued.
전체 예외 메시지가 필요한 경우 디버그 빌드를 대신 실행합니다. 예를 들어 릴리스 빌드의 이전 예외 정보는 디버그 빌드에 다음과 같이 표시될 수 있습니다.
Exception thrown: 'System.AggregateException' in NativeApp.exe.
Additional information: Value does not fall within the expected range.
런타임 호출 스택
인라인 처리 및 기타 최적화로 인해 .NET 네이티브 도구 체인에서 컴파일한 앱에서 표시하는 호출 스택은 런타임 예외의 경로를 명확하게 식별하는 데 도움이 되지 않을 수 있습니다.
전체 스택을 얻으려면 디버그 빌드를 대신 실행합니다.