네이티브 이미지 생성기(Ngen.exe)는 관리되는 애플리케이션의 성능을 향상시키는 도구입니다. Ngen.exe 컴파일된 프로세서별 컴퓨터 코드를 포함하는 파일인 네이티브 이미지를 만들고 로컬 컴퓨터의 네이티브 이미지 캐시에 설치합니다. 런타임은 JIT(Just-In-Time) 컴파일러를 사용하여 원래 어셈블리를 컴파일하는 대신 캐시의 네이티브 이미지를 사용할 수 있습니다.
비고
Ngen.exe .NET Framework만 대상으로 하는 어셈블리에 대한 네이티브 이미지를 컴파일합니다. .NET Core에 해당하는 네이티브 이미지 생성기는 CrossGen입니다.
.NET Framework 4의 Ngen.exe 변경 내용:
이제 Ngen.exe 완전 신뢰로 어셈블리를 컴파일하고 CAS(코드 액세스 보안) 정책이 더 이상 평가되지 않습니다.
Ngen.exe 사용하여 생성된 네이티브 이미지는 부분 신뢰에서 실행되는 애플리케이션에 더 이상 로드할 수 없습니다.
.NET Framework 버전 2.0의 Ngen.exe 변경 내용:
어셈블리를 설치하면 해당 종속성도 설치되며 Ngen.exe구문이 간소화됩니다.
이제 네이티브 이미지를 애플리케이션 도메인 간에 공유할 수 있습니다.
새 작업,
update무효화된 이미지를 다시 만듭니다.컴퓨터에서 유휴 시간을 사용하여 이미지를 생성하고 설치하는 서비스에서 실행을 지연할 수 있습니다.
이미지 무효화의 일부 원인이 제거되었습니다.
Windows 8에서 네이티브 이미지 작업을 참조하세요.
Ngen.exe 및 네이티브 이미지 서비스 사용에 대한 자세한 내용은 네이티브 이미지 서비스를 참조하세요.
비고
.NET Framework 버전 1.0 및 1.1에 대한 Ngen.exe 구문은 네이티브 이미지 생성기(Ngen.exe) 레거시 구문에서 찾을 수 있습니다.
이 도구는 자동으로 Visual Studio와 함께 설치됩니다. 도구를 실행하려면 Visual Studio 개발자 명령 프롬프트 또는 Visual Studio 개발자 PowerShell을 사용합니다.
명령 프롬프트에 다음을 입력합니다.
문법
ngen action [options]
ngen /? | /help
활동
다음 표에서는 각 action.의 구문을 보여줍니다. 개별 부분에 action대한 설명은 인수, 우선 순위 수준, 시나리오 및 구성 테이블을 참조하세요.
옵션 표에서는 options 도움말 스위치와 도움말 스위치에 대해 설명합니다.
| 조치 | Description |
|---|---|
install[assemblyName | assemblyPath] [scenarios] [config] [/queue{:|1|23}]] |
어셈블리 및 해당 종속성에 대한 네이티브 이미지를 생성하고 네이티브 이미지 캐시에 이미지를 설치합니다. 지정된 경우 /queue 작업은 네이티브 이미지 서비스에 대해 큐에 대기됩니다. 기본 우선 순위는 3입니다.
우선 순위 수준 테이블을 참조하세요. |
uninstall [assemblyName | assemblyPath] [scenarios] [config] |
네이티브 이미지 캐시에서 어셈블리 및 해당 종속성의 네이티브 이미지를 삭제합니다. 단일 이미지 및 해당 종속성을 제거하려면 이미지를 설치하는 데 사용된 것과 동일한 명령줄 인수를 사용합니다. 메모: .NET Framework 4 uninstall 부터 작업 *은 더 이상 지원되지 않습니다. |
update [/queue] |
유효하지 않은 네이티브 이미지를 업데이트합니다. 지정된 경우 /queue 네이티브 이미지 서비스에 대한 업데이트가 큐에 대기됩니다. 업데이트는 항상 우선 순위 3으로 예약되므로 컴퓨터가 유휴 상태일 때 실행됩니다. |
display [assemblyName | assemblyPath] |
어셈블리 및 해당 종속성에 대한 네이티브 이미지의 상태를 표시합니다. 인수가 제공되지 않으면 네이티브 이미지 캐시의 모든 항목이 표시됩니다. |
executeQueuedItems [1|2|3]-또는- eqi [1|2|3] |
큐에 대기된 컴파일 작업을 실행합니다. 우선 순위를 지정하면 우선 순위가 크거나 같은 컴파일 작업이 실행됩니다. 우선 순위를 지정하지 않으면 대기 중인 모든 컴파일 작업이 실행됩니다. |
queue{pause | | continuestatus} |
네이티브 이미지 서비스를 일시 중지하거나, 일시 중지된 서비스를 계속하도록 허용하거나, 서비스의 상태를 쿼리합니다. |
Arguments
| Argument | Description |
|---|---|
assemblyName |
어셈블리의 전체 표시 이름입니다. 예: "myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5".
메모: 부분 어셈블리 이름(예: myAssembly작업)을 displayuninstall 제공할 수 있습니다. Ngen.exe 명령줄당 하나의 어셈블리만 지정할 수 있습니다. |
assemblyPath |
어셈블리의 명시적 경로입니다. 전체 또는 상대 경로를 지정할 수 있습니다. 경로 없이 파일 이름을 지정하는 경우 어셈블리는 현재 디렉터리에 있어야 합니다. Ngen.exe 명령줄당 하나의 어셈블리만 지정할 수 있습니다. |
우선 순위 수준
| Priority | Description |
|---|---|
1 |
네이티브 이미지는 유휴 시간을 기다리지 않고 즉시 생성되고 설치됩니다. |
2 |
네이티브 이미지는 유휴 시간 동안 기다리지 않고 생성되고 설치되지만 우선 순위 1개 작업(및 종속성)이 모두 완료된 후에는 설치됩니다. |
3 |
네이티브 이미지 서비스는 컴퓨터가 유휴 상태임을 감지하면 네이티브 이미지가 설치됩니다. 네이티브 이미지 서비스를 참조하세요. |
시나리오
| Scenario | Description |
|---|---|
/Debug |
디버거에서 사용할 수 있는 네이티브 이미지를 생성합니다. |
/Profile |
프로파일러에서 사용할 수 있는 네이티브 이미지를 생성합니다. |
/NoDependencies |
지정된 시나리오 옵션에 필요한 최소 네이티브 이미지 수를 생성합니다. |
설정
| 구성 / 설정 | Description |
|---|---|
/ExeConfig:
exePath
|
지정된 실행 파일 어셈블리의 구성을 사용합니다. Ngen.exe 종속성에 바인딩할 때 로더와 동일한 결정을 내려야 합니다. 런타임에 공유 구성 요소가 로드될 때 메서드를 사용하여 Load 애플리케이션의 구성 파일은 공유 구성 요소에 대해 로드되는 종속성(예: 로드된 종속성 버전)을 결정합니다. 스위치는 /ExeConfig 런타임에 로드될 종속성에 대한 Ngen.exe 지침을 제공합니다. |
/AppBase:
directoryPath
|
종속성을 찾을 때 지정된 디렉터리를 애플리케이션 기반으로 사용합니다. |
Options
| Option | Description |
|---|---|
/nologo |
Microsoft 시작 배너 표시를 표시하지 않습니다. |
/silent |
성공 메시지 표시를 표시하지 않습니다. |
/verbose |
디버깅에 대한 자세한 정보를 표시합니다. |
/help, /? |
현재 릴리스에 대한 명령 구문 및 옵션을 표시합니다. |
비고
Ngen.exe실행하려면 관리 권한이 있어야 합니다.
주의
완전히 신뢰할 수 없는 어셈블리에서 Ngen.exe 실행하지 마세요. .NET Framework 4부터 Ngen.exe 완전 신뢰로 어셈블리를 컴파일하고 CAS(코드 액세스 보안) 정책이 더 이상 평가되지 않습니다.
.NET Framework 4부터는 Ngen.exe 사용하여 생성된 네이티브 이미지를 부분 신뢰로 실행되는 애플리케이션에 더 이상 로드할 수 없습니다. 대신 JIT(Just-In-Time) 컴파일러가 호출됩니다.
Ngen.exe 작업 및 모든 종속성에 대한 인수로 assemblyname 지정된 어셈블리에 install 대한 네이티브 이미지를 생성합니다. 종속성은 어셈블리 매니페스트의 참조에서 결정됩니다. 종속성을 별도로 설치해야 하는 유일한 시나리오는 애플리케이션이 리플렉션을 사용하여 로드하는 경우입니다(예: 메서드 호출 Assembly.Load ).
중요합니다
네이티브 이미지와 함께 메서드를 Assembly.LoadFrom 사용하지 마세요. 이 메서드를 사용하여 로드된 이미지는 실행 컨텍스트의 다른 어셈블리에서 사용할 수 없습니다.
Ngen.exe 종속성에 대한 개수를 유지 관리합니다. 예를 들어 네이티브 이미지 캐시에 둘 다 설치되고 둘 다에 대한 참조가 있다고 가정 MyAssembly.exeYourAssembly.exe 합니다 OurDependency.dll. 제거 OurDependency.dll 된 경우 MyAssembly.exe 제거되지 않습니다. 제거될 때만 YourAssembly.exe 제거됩니다.
전역 어셈블리 캐시에서 어셈블리에 대한 네이티브 이미지를 생성하는 경우 해당 표시 이름을 지정합니다. Assembly.FullName을(를) 참조하세요.
Ngen.exe 생성하는 네이티브 이미지는 애플리케이션 도메인 간에 공유할 수 있습니다. 즉, 애플리케이션 도메인 간에 어셈블리를 공유해야 하는 애플리케이션 시나리오에서 Ngen.exe 사용할 수 있습니다. 도메인 중립성을 지정하려면 다음을 수행합니다.
애플리케이션에 LoaderOptimizationAttribute 특성을 적용합니다.
새 애플리케이션 도메인에 AppDomainSetup.LoaderOptimization 대한 설정 정보를 만들 때 속성을 설정합니다.
동일한 어셈블리를 여러 애플리케이션 도메인에 로드할 때 항상 도메인 중립 코드를 사용합니다. 공유 도메인에 로드된 후 네이티브 이미지가 공유되지 않는 애플리케이션 도메인에 로드되는 경우 사용할 수 없습니다.
비고
도메인 중립 코드를 언로드할 수 없으며, 특히 정적 멤버에 액세스할 때 성능이 약간 느려질 수 있습니다.
이 설명 섹션에서는 다음을 수행합니다.
다양한 시나리오에 대한 이미지 생성
어셈블리에 대한 네이티브 이미지를 생성한 후 런타임은 어셈블리를 실행할 때마다 이 네이티브 이미지를 자동으로 찾아 사용하려고 시도합니다. 사용 시나리오에 따라 여러 이미지를 생성할 수 있습니다.
예를 들어 디버깅 또는 프로파일링 시나리오에서 어셈블리를 실행하는 경우 런타임은 또는 /Profile 옵션으로 /Debug 생성된 네이티브 이미지를 찾습니다. 일치하는 네이티브 이미지를 찾을 수 없는 경우 런타임은 표준 JIT 컴파일로 되돌아갑니다. 네이티브 이미지를 디버그하는 유일한 방법은 옵션을 사용하여 네이티브 이미지를 만드는 것입니다 /Debug .
또한 작업은 uninstall 시나리오를 인식하므로 모든 시나리오 또는 선택한 시나리오만 제거할 수 있습니다.
네이티브 이미지를 사용할 시기 결정
네이티브 이미지는 메모리 사용 개선과 시작 시간 단축이라는 두 가지 영역에서 성능 향상을 제공할 수 있습니다.
비고
네이티브 이미지의 성능은 코드 및 데이터 액세스 패턴, 모듈 경계를 넘어 수행되는 호출 수, 다른 애플리케이션에서 이미 로드한 종속성 수 등 분석을 어렵게 만드는 여러 요인에 따라 달라집니다. 네이티브 이미지가 애플리케이션에 도움이 되는지 여부를 확인하는 유일한 방법은 주요 배포 시나리오에서 신중한 성능 측정을 수행하는 것입니다.
향상된 메모리 사용
네이티브 이미지는 코드가 프로세스 간에 공유될 때 메모리 사용을 크게 향상시킬 수 있습니다. 네이티브 이미지는 Windows PE 파일이므로 .dll 파일의 단일 복사본을 여러 프로세스에서 공유할 수 있습니다. 반면 JIT 컴파일러에서 생성된 네이티브 코드는 프라이빗 메모리에 저장되며 공유할 수 없습니다.
터미널 서비스에서 실행되는 애플리케이션은 공유 코드 페이지의 이점을 활용할 수도 있습니다.
또한 JIT 컴파일러를 로드하지 않으면 각 애플리케이션 인스턴스에 대해 고정된 양의 메모리가 저장됩니다.
빠른 애플리케이션 시작
Ngen.exe 어셈블리를 미리 컴파일하면 일부 애플리케이션의 시작 시간이 향상될 수 있습니다. 일반적으로 애플리케이션이 구성 요소 어셈블리를 공유하는 경우 첫 번째 애플리케이션이 시작된 후 공유 구성 요소가 후속 애플리케이션에 대해 이미 로드되었기 때문에 얻을 수 있습니다. 하드 디스크 액세스 시간이 주로 사용되기 때문에 애플리케이션의 모든 어셈블리를 하드 디스크에서 로드해야 하는 콜드 시작은 네이티브 이미지만큼 많은 이점을 얻지 못합니다.
하드 바인딩은 주 애플리케이션 어셈블리에 하드 바인딩된 모든 이미지를 동시에 로드해야 하므로 시작 시간에 영향을 줄 수 있습니다.
비고
.NET Framework 3.5 서비스 팩 1 이전에는 로더가 전역 어셈블리 캐시에 없는 강력한 이름의 어셈블리에 대해 추가 유효성 검사를 수행하므로 공유된 강력한 이름의 구성 요소를 전역 어셈블리 캐시에 배치해야 하므로 네이티브 이미지를 사용하여 얻은 시작 시간이 개선되지 않습니다. .NET Framework 3.5 SP1에 도입된 최적화는 추가 유효성 검사를 제거했습니다.
사용 고려 사항 요약
다음과 같은 일반적인 고려 사항 및 애플리케이션 고려 사항은 애플리케이션에 대한 네이티브 이미지를 평가하는 작업을 수행할지 여부를 결정하는 데 도움이 될 수 있습니다.
기본 이미지는 JIT 컴파일 및 형식 안전 확인과 같은 많은 시작 작업이 필요하지 않으므로 CIL보다 빠르게 로드됩니다.
기본 이미지는 JIT 컴파일러가 필요하지 않으므로 더 작은 초기 작업 집합이 필요합니다.
네이티브 이미지는 프로세스 간에 코드 공유를 사용하도록 설정합니다.
네이티브 이미지는 CIL 어셈블리보다 더 많은 하드 디스크 공간이 필요하며 생성하는 데 상당한 시간이 필요할 수 있습니다.
네이티브 이미지를 유지 관리해야 합니다.
원래 어셈블리 또는 해당 종속성 중 하나가 서비스될 때 이미지를 다시 생성해야 합니다.
단일 어셈블리는 여러 애플리케이션 또는 다른 시나리오에서 사용하기 위해 여러 네이티브 이미지가 필요할 수 있습니다. 예를 들어 두 애플리케이션의 구성 정보는 동일한 종속 어셈블리에 대해 서로 다른 바인딩 결정을 내릴 수 있습니다.
네이티브 이미지는 관리자가 생성해야 합니다. 즉, Administrators 그룹의 Windows 계정에서 가져옵니다.
이러한 일반적인 고려 사항 외에도 네이티브 이미지가 성능 이점을 제공할 수 있는지 여부를 결정할 때 애플리케이션의 특성을 고려해야 합니다.
애플리케이션이 여러 공유 구성 요소를 사용하는 환경에서 실행되는 경우 네이티브 이미지를 사용하면 여러 프로세스에서 구성 요소를 공유할 수 있습니다.
애플리케이션에서 여러 애플리케이션 도메인을 사용하는 경우 네이티브 이미지를 사용하면 코드 페이지를 도메인 간에 공유할 수 있습니다.
비고
.NET Framework 버전 1.0 및 1.1에서는 네이티브 이미지를 애플리케이션 도메인 간에 공유할 수 없습니다. 버전 2.0 이상에서는 그렇지 않습니다.
애플리케이션이 터미널 서버에서 실행되는 경우 네이티브 이미지는 코드 페이지 공유를 허용합니다.
대용량 애플리케이션은 일반적으로 컴파일에서 네이티브 이미지로의 이점을 활용합니다. 소규모 애플리케이션은 일반적으로 도움이 되지 않습니다.
장기 실행 애플리케이션의 경우 런타임 JIT 컴파일은 네이티브 이미지보다 약간 더 잘 수행됩니다. (하드 바인딩은 이러한 성능 차이를 어느 정도 완화할 수 있습니다.)
어셈블리 기본 주소의 중요도
네이티브 이미지는 Windows PE 파일이므로 다른 실행 파일과 동일한 재보정 문제가 적용됩니다. 하드 바인딩을 사용하는 경우 재배치의 성능 비용이 훨씬 더 두드러집니다.
네이티브 이미지의 기본 주소를 설정하려면 컴파일러의 적절한 옵션을 사용하여 어셈블리의 기본 주소를 설정합니다. Ngen.exe 네이티브 이미지에 이 기본 주소를 사용합니다.
비고
네이티브 이미지는 생성된 관리되는 어셈블리보다 큽합니다. 이러한 더 큰 크기를 허용하려면 기본 주소를 계산해야 합니다.
dumpbin.exe 같은 도구를 사용하여 네이티브 이미지의 기본 기본 주소를 볼 수 있습니다.
하드 바인딩
하드 바인딩은 처리량을 증가시키고 네이티브 이미지의 작업 집합 크기를 줄입니다. 하드 바인딩의 단점은 어셈블리가 로드될 때 어셈블리에 하드 바인딩된 모든 이미지를 로드해야 한다는 것입니다. 이렇게 하면 대규모 애플리케이션의 시작 시간이 크게 늘어나게 될 수 있습니다.
하드 바인딩은 모든 애플리케이션의 성능에 중요한 시나리오에서 로드되는 종속성에 적합합니다. 네이티브 이미지 사용의 모든 측면과 마찬가지로, 하드 바인딩이 애플리케이션의 성능을 향상시키는지 여부를 결정하는 유일한 방법은 신중한 성능 측정입니다.
DependencyAttribute 및 DefaultDependencyAttribute 특성을 사용하면 Ngen.exe하드 바인딩 힌트를 제공할 수 있습니다.
비고
이러한 특성은 명령이 아니라 Ngen.exe대한 힌트입니다. 이를 사용하면 하드 바인딩이 보장되지 않습니다. 이러한 특성의 의미는 이후 릴리스에서 변경될 수 있습니다.
종속성에 대한 바인딩 힌트 지정
어셈블리에 DependencyAttribute 적용하여 지정된 종속성이 로드될 가능성을 나타냅니다. LoadHint.Always 는 하드 바인딩이 적절함을 나타내고, Default 종속성에 대한 기본값을 사용해야 함을 나타내며 Sometimes , 하드 바인딩이 적절하지 않음을 나타냅니다.
다음 코드는 두 종속성이 있는 어셈블리에 대한 특성을 보여 있습니다. 첫 번째 종속성(Assembly1)은 하드 바인딩에 적합한 후보이며 두 번째(Assembly2)는 그렇지 않습니다.
Imports System.Runtime.CompilerServices
<Assembly:DependencyAttribute("Assembly1", LoadHint.Always)>
<Assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)>
using System.Runtime.CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)]
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)]
using namespace System::Runtime::CompilerServices;
[assembly:DependencyAttribute("Assembly1", LoadHint.Always)];
[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)];
어셈블리 이름에는 파일 이름 확장명을 포함하지 않습니다. 표시 이름을 사용할 수 있습니다.
어셈블리에 대한 기본 바인딩 힌트 지정
기본 바인딩 힌트는 종속성이 있는 애플리케이션에서 즉시 자주 사용되는 어셈블리에만 필요합니다. 이러한 어셈블리에 DefaultDependencyAttribute with LoadHint.Always 를 적용하여 하드 바인딩을 사용하도록 지정합니다.
비고
이 범주에 속하지 않는 .dll 어셈블리에 적용 DefaultDependencyAttribute 할 이유가 없습니다. 특성이 적용되지 않는 것과 같은 효과가 있는 LoadHint.Always 값 이외의 값으로 특성을 적용하기 때문입니다.
Microsoft는 하드 바인딩이 .NET Framework의 매우 적은 수의 어셈블리(예: mscorlib.dll)의 기본값임을 지정하는 데 사용합니다 DefaultDependencyAttribute .
지연된 처리
매우 큰 애플리케이션에 대한 네이티브 이미지 생성에는 상당한 시간이 걸릴 수 있습니다. 마찬가지로 공유 구성 요소 또는 컴퓨터 설정을 변경하려면 많은 네이티브 이미지를 업데이트해야 할 수 있습니다. 및 update 작업에 /queue 는 install 네이티브 이미지 서비스에 의해 지연된 실행을 위해 작업을 큐에 대기하는 옵션이 있습니다. 또한 Ngen.exe queue 서비스에 대한 제어를 제공하는 작업과 executeQueuedItems 있습니다. 자세한 내용은 네이티브 이미지 서비스를 참조하세요.
네이티브 이미지 및 JIT 컴파일
Ngen.exe 생성할 수 없는 어셈블리에서 메서드를 발견하면 네이티브 이미지에서 제외됩니다. 런타임이 이 어셈블리를 실행하면 네이티브 이미지에 포함되지 않은 메서드에 대한 JIT 컴파일로 되돌아갑니다.
또한 어셈블리가 업그레이드되었거나 어떤 이유로든 이미지가 무효화된 경우 네이티브 이미지가 사용되지 않습니다.
잘못된 이미지
Ngen.exe 사용하여 어셈블리의 네이티브 이미지를 만들 때 출력은 지정한 명령줄 옵션과 컴퓨터의 특정 설정에 따라 달라집니다. 이 설정은 다음을 포함합니다.
.NET Framework의 버전입니다.
어셈블리의 정확한 ID입니다(다시 컴파일하면 ID가 변경됨).
어셈블리가 참조하는 모든 어셈블리의 정확한 ID입니다(다시 컴파일하면 ID가 변경됨).
보안 요소.
Ngen.exe 네이티브 이미지를 생성할 때 이 정보를 기록합니다. 어셈블리를 실행할 때 런타임은 컴퓨터의 현재 환경과 일치하는 옵션 및 설정으로 생성된 네이티브 이미지를 찾습니다. 일치하는 네이티브 이미지를 찾을 수 없는 경우 런타임은 어셈블리의 JIT 컴파일로 돌아갑니다. 컴퓨터의 설정 및 환경이 다음과 같이 변경되면 네이티브 이미지가 잘못됩니다.
.NET Framework의 버전입니다.
.NET Framework에 업데이트를 적용하면 Ngen.exe 사용하여 만든 모든 네이티브 이미지가 유효하지 않습니다. 이러한 이유로 .NET Framework의 모든 업데이트는 명령을 실행
Ngen Update하여 모든 네이티브 이미지가 다시 생성되도록 합니다. .NET Framework는 설치하는 .NET Framework 라이브러리에 대한 새 네이티브 이미지를 자동으로 만듭니다.어셈블리의 정확한 ID입니다.
어셈블리를 다시 컴파일하면 어셈블리의 해당 네이티브 이미지가 유효하지 않습니다.
어셈블리가 참조하는 어셈블리의 정확한 ID입니다.
관리되는 어셈블리를 업데이트하는 경우 직접 또는 간접적으로 해당 어셈블리에 종속된 모든 네이티브 이미지가 유효하지 않으며 다시 생성되어야 합니다. 여기에는 일반 참조와 하드 바인딩된 종속성이 모두 포함됩니다. 소프트웨어 업데이트가 적용될 때마다 설치 프로그램은 모든 종속 네이티브 이미지가 다시 생성되도록 명령을 실행
Ngen Update해야 합니다.보안 요소.
이전에 어셈블리에 부여된 권한을 제한하도록 컴퓨터 보안 정책을 변경하면 해당 어셈블리에 대해 이전에 컴파일된 네이티브 이미지가 잘못될 수 있습니다.
공용 언어 런타임이 코드 액세스 보안을 관리하는 방법과 사용 권한을 사용하는 방법에 대한 자세한 내용은 코드 액세스 보안을 참조하세요.
Troubleshooting
다음 문제 해결 항목에서는 사용 중인 네이티브 이미지와 애플리케이션에서 사용할 수 없는 이미지를 확인하고, JIT 컴파일러가 메서드를 컴파일하기 시작하는 시기를 확인하고, 지정된 메서드의 네이티브 이미지 컴파일을 옵트아웃하는 방법을 보여 줍니다.
어셈블리 바인딩 로그 뷰어
네이티브 이미지가 애플리케이션에서 사용되고 있는지 확인하려면 Fuslogvw.exe(어셈블리 바인딩 로그 뷰어)를 사용할 수 있습니다. 바인딩 로그 뷰어 창의 로그 범주 상자에서 네이티브 이미지를 선택합니다. Fuslogvw.exe 네이티브 이미지가 거부된 이유에 대한 정보를 제공합니다.
JITCompilationStart 관리 디버깅 도우미
jitCompilationStart MDA(관리 디버깅 도우미)를 사용하여 JIT 컴파일러가 함수 컴파일을 시작하는 시기를 결정할 수 있습니다.
네이티브 이미지 생성 옵트아웃
경우에 따라 NGen.exe 특정 메서드에 대한 네이티브 이미지를 생성하는 데 어려움을 겪거나 네이티브 이미지로 컴파일하는 대신 JIT를 컴파일하는 것이 좋습니다. 이 경우 특성을 사용하여 System.Runtime.BypassNGenAttribute NGen.exe 특정 메서드에 대한 네이티브 이미지를 생성하지 못하도록 할 수 있습니다. 네이티브 이미지에 포함하지 않으려는 코드를 가진 각 메서드에 특성을 개별적으로 적용해야 합니다. NGen.exe 특성을 인식하고 해당 메서드에 대한 네이티브 이미지에서 코드를 생성하지 않습니다.
그러나 BypassNGenAttribute .NET Framework 클래스 라이브러리의 형식으로 정의되지는 않습니다. 코드에서 특성을 사용하려면 먼저 다음과 같이 정의해야 합니다.
namespace System.Runtime
{
[AttributeUsage(AttributeTargets.Method |
AttributeTargets.Constructor |
AttributeTargets.Property)]
public class BypassNGenAttribute : Attribute
{
}
}
Namespace System.Runtime
<AttributeUsage(AttributeTargets.Method Or
AttributeTargets.Constructor Or
AttributeTargets.Property)>
Public Class BypassNGenAttribute : Inherits Attribute
End Class
End Namespace
그런 다음 메서드별로 특성을 적용할 수 있습니다. 다음 예제에서는 네이티브 이미지 생성기에 메서드에 대한 ExampleClass.ToJITCompile 네이티브 이미지를 생성하지 않도록 지시합니다.
using System;
using System.Runtime;
public class ExampleClass
{
[BypassNGen]
public void ToJITCompile()
{
}
}
Imports System.Runtime
Public Class ExampleClass
<BypassNGen>
Public Sub ToJITCompile()
End Sub
End Class
예시
다음 명령은 현재 디렉터리에 있는 네이티브 이미지를 ClientApp.exe생성하고 네이티브 이미지 캐시에 이미지를 설치합니다. 어셈블리에 대한 구성 파일이 있는 경우 Ngen.exe 사용합니다. 또한 참조하는 모든 .dll 파일에 대해 네이 ClientApp.exe 티브 이미지가 생성됩니다.
ngen install ClientApp.exe
Ngen.exe 함께 설치된 이미지를 루트라고도합니다. 루트는 애플리케이션 또는 공유 구성 요소일 수 있습니다.
다음 명령은 지정된 경로에 대한 MyAssembly.exe 네이티브 이미지를 생성합니다.
ngen install c:\myfiles\MyAssembly.exe
어셈블리 및 해당 종속성을 찾을 때 Ngen.exe 공용 언어 런타임에서 사용하는 것과 동일한 검색 논리를 사용합니다. 기본적으로 포함된 ClientApp.exe 디렉터리가 애플리케이션 기본 디렉터리로 사용되고 모든 어셈블리 검색이 이 디렉터리에서 시작됩니다. 이 옵션을 사용하여 이 동작을 재정의할 /AppBase 수 있습니다.
비고
이는 애플리케이션 기반이 현재 디렉터리로 설정된 .NET Framework 버전 1.0 및 1.1의 Ngen.exe 동작에서 변경된 것입니다.
어셈블리는 메서드를 사용하여 Assembly.Load .dll 파일을 로드하는 경우와 같이 참조 없이 종속성을 가질 수 있습니다. 옵션과 함께 /ExeConfig 애플리케이션 어셈블리에 대한 구성 정보를 사용하여 이러한 .dll 파일에 대한 네이티브 이미지를 만들 수 있습니다. 다음 명령은 에서 구성 정보를 MyApp.exe사용하기 위한 MyLib.dll 네이티브 이미지를 생성합니다.
ngen install c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe
이러한 방식으로 설치된 어셈블리는 애플리케이션을 제거할 때 제거되지 않습니다.
종속성을 제거하려면 종속성을 설치하는 데 사용된 것과 동일한 명령줄 옵션을 사용합니다. 다음 명령은 이전 예제에서 제거합니다 MyLib.dll .
ngen uninstall c:\myfiles\MyLib.dll /ExeConfig:c:\myapps\MyApp.exe
전역 어셈블리 캐시에서 어셈블리에 대한 네이티브 이미지를 만들려면 어셈블리의 표시 이름을 사용합니다. 다음은 그 예입니다.
ngen install "ClientApp, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"
NGen.exe 설치하는 각 시나리오에 대해 별도의 이미지 집합을 생성합니다. 예를 들어 다음 명령은 정상 작업을 위한 네이티브 이미지의 전체 집합, 디버깅을 위한 또 다른 전체 집합 및 프로파일링을 위한 세 번째 이미지를 설치합니다.
ngen install MyApp.exe
ngen install MyApp.exe /debug
ngen install MyApp.exe /profile
네이티브 이미지 캐시 표시
네이티브 이미지가 캐시에 설치되면 Ngen.exe사용하여 표시할 수 있습니다. 다음 명령은 네이티브 이미지 캐시의 모든 네이티브 이미지를 표시합니다.
ngen display
작업은 display 먼저 모든 루트 어셈블리를 나열한 다음 컴퓨터의 모든 네이티브 이미지 목록을 나열합니다.
어셈블리의 간단한 이름을 사용하여 해당 어셈블리에 대한 정보만 표시합니다. 다음 명령은 부분 이름 MyAssembly, 해당 종속성 및 종속성이 있는 모든 루트와 일치하는 네이티브 이미지 캐시의 MyAssembly모든 네이티브 이미지를 표시합니다.
ngen display MyAssembly
공유 구성 요소 어셈블리에 의존하는 루트를 아는 것은 공유 구성 요소가 업그레이드된 후 작업의 update 영향을 측정하는 데 유용합니다.
어셈블리의 파일 확장자를 지정하는 경우 경로를 지정하거나 어셈블리가 포함된 디렉터리에서 Ngen.exe 실행해야 합니다.
ngen display c:\myApps\MyAssembly.exe
다음 명령은 이름 MyAssembly 및 버전 1.0.0.0을 사용하여 네이티브 이미지 캐시의 모든 네이티브 이미지를 표시합니다.
ngen display "myAssembly, version=1.0.0.0"
이미지 업데이트
이미지는 일반적으로 공유 구성 요소가 업그레이드된 후에 업데이트됩니다. 변경되었거나 종속성이 변경된 모든 네이티브 이미지를 업데이트하려면 인수 없이 작업을 사용합니다 update .
ngen update
모든 이미지를 업데이트하는 데는 긴 과정이 걸릴 수 있습니다. 옵션을 사용하여 네이티브 이미지 서비스에서 실행을 위해 업데이트를 큐에 추가할 /queue 수 있습니다. 옵션 및 설치 우선 순위에 대한 /queue 자세한 내용은 Native Image Service를 참조하세요.
ngen update /queue
이미지 제거
Ngen.exe 종속성 목록을 유지 관리하므로 공유 구성 요소는 종속된 모든 어셈블리가 제거된 경우에만 제거됩니다. 또한 공유 구성 요소는 루트로 설치된 경우 제거되지 않습니다.
다음 명령은 루트 ClientApp.exe에 대한 모든 시나리오를 제거합니다.
ngen uninstall ClientApp
이 uninstall 작업은 특정 시나리오를 제거하는 데 사용할 수 있습니다. 다음 명령은 다음에 대한 모든 디버그 시나리오를 ClientApp.exe제거합니다.
ngen uninstall ClientApp /debug
비고
시나리오를 /debug 제거해도 둘 다 /profile 포함된 시나리오는 제거되지 않습니다. /debug.
다음 명령은 특정 버전의 ClientApp.exe모든 시나리오를 제거합니다.
ngen uninstall "ClientApp, Version=1.0.0.0"
다음 명령은 해당 어셈블리에 대한 "ClientApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"모든 시나리오 또는 디버그 시나리오만 제거합니다.
ngen uninstall "ClientApp, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"
ngen uninstall "ClientApp, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL" /debug
작업과 install 마찬가지로 확장을 제공하려면 어셈블리가 포함된 디렉터리에서 Ngen.exe 실행하거나 전체 경로를 지정해야 합니다.
네이티브 이미지 서비스와 관련된 예제는 네이티브 이미지 서비스를 참조하세요.
네이티브 이미지 작업
네이티브 이미지 작업은 네이티브 이미지를 생성하고 유지 관리하는 Windows 작업입니다. 네이티브 이미지 작업은 지원되는 시나리오에 대해 네이티브 이미지를 자동으로 생성하고 회수합니다. 또한 설치 관리자는 Ngen.exe(네이티브 이미지 생성기) 를 사용하여 지연된 시간에 네이티브 이미지를 만들고 업데이트할 수 있습니다.
네이티브 이미지 작업은 컴퓨터에서 지원되는 각 CPU 아키텍처에 대해 한 번 등록되어 각 아키텍처를 대상으로 하는 애플리케이션에 대한 컴파일을 허용합니다.
| 작업 이름 | 32비트 컴퓨터 | 64비트 컴퓨터 |
|---|---|---|
| NET Framework NGEN v4.0.30319 | Yes | Yes |
| NET Framework NGEN v4.0.30319 64 | 아니오 | Yes |
네이티브 이미지 작업은 Windows 8 이상에서 실행할 때 .NET Framework 4.5 이상 버전에서 사용할 수 있습니다. 이전 버전의 Windows에서 .NET Framework는 네이티브 이미지 서비스를 사용합니다.
작업 수명
일반적으로 Windows 작업 스케줄러는 컴퓨터가 유휴 상태일 때 매일 밤 네이티브 이미지 작업을 시작합니다. 태스크는 애플리케이션 설치 관리자가 대기 중인 지연된 작업, 지연된 네이티브 이미지 업데이트 요청 및 자동 이미지 생성을 확인합니다. 작업이 미해결 작업 항목을 완료한 다음 종료됩니다. 작업이 실행되는 동안 컴퓨터가 유휴 상태가 중지되면 작업이 중지됩니다.
작업 스케줄러 UI 또는 NGen.exe대한 수동 호출을 통해 네이티브 이미지 작업을 수동으로 시작할 수도 있습니다. 이러한 방법 중 하나를 통해 작업을 시작하면 컴퓨터가 더 이상 유휴 상태가 되지 않을 때 계속 실행됩니다. NGen.exe 사용하여 수동으로 만든 이미지는 애플리케이션 설치 관리자에 대해 예측 가능한 동작을 사용하도록 설정하기 위해 우선 순위가 지정됩니다.
네이티브 이미지 서비스
네이티브 이미지 서비스는 네이티브 이미지를 생성하고 유지 관리하는 Windows 서비스입니다. 네이티브 이미지 서비스를 사용하면 개발자가 네이티브 이미지의 설치 및 업데이트를 컴퓨터가 유휴 상태인 기간으로 연기할 수 있습니다.
일반적으로 네이티브 이미지 서비스는 애플리케이션 또는 업데이트에 대한 설치 프로그램(설치 관리자)에 의해 시작됩니다. 우선 순위 3 작업의 경우 서비스는 컴퓨터에서 유휴 시간 동안 실행됩니다. 서비스는 상태를 저장하고 필요한 경우 여러 다시 부팅을 계속할 수 있습니다. 여러 이미지 컴파일을 큐에 대기할 수 있습니다.
또한 서비스는 수동 Ngen.exe 명령과 상호 작용합니다. 수동 명령은 백그라운드 작업보다 우선합니다.
비고
Windows Vista에서 네이티브 이미지 서비스에 대해 표시되는 이름은 "Microsoft.NET Framework NGEN v2.0.50727_X86" 또는 "Microsoft.NET Framework NGEN v2.0.50727_X64"입니다. 이전 버전의 모든 Microsoft Windows에서 이름은 ".NET 런타임 최적화 서비스 v2.0.50727_X86" 또는 ".NET 런타임 최적화 서비스 v2.0.50727_X64"입니다.
지연 작업 시작
설치 또는 업그레이드를 시작하기 전에 서비스를 일시 중지하는 것이 좋습니다. 이렇게 하면 설치 관리자가 파일을 복사하거나 어셈블리를 전역 어셈블리 캐시에 배치하는 동안 서비스가 실행되지 않습니다. 다음 Ngen.exe 명령줄은 서비스를 일시 중지합니다.
ngen queue pause
지연된 모든 작업이 큐에 대기된 경우 다음 명령을 사용하여 서비스를 다시 시작할 수 있습니다.
ngen queue continue
새 애플리케이션을 설치하거나 공유 구성 요소를 업데이트할 때 네이티브 이미지 생성을 연기하려면 이 옵션을 사용하거나 update 작업과 함께 install 사용합니다/queue. 다음 Ngen.exe 명령줄은 공유 구성 요소에 대한 네이티브 이미지를 설치하고 영향을 받을 수 있는 모든 루트의 업데이트를 수행합니다.
ngen install MyComponent /queue
ngen update /queue
이 update 작업은 사용하는 MyComponent이미지뿐만 아니라 무효화된 모든 네이티브 이미지를 다시 생성합니다.
애플리케이션이 많은 루트로 구성된 경우 지연된 작업의 우선 순위를 제어할 수 있습니다. 다음 명령은 3개의 루트 설치를 큐에 대기합니다.
Assembly1 는 유휴 시간을 기다리지 않고 먼저 설치됩니다.
Assembly2 는 유휴 시간 동안 기다리지 않고 설치되지만 우선 순위 1 작업이 모두 완료된 후에 설치됩니다.
Assembly3 는 서비스가 컴퓨터가 유휴 상태임을 감지할 때 설치됩니다.
ngen install Assembly1 /queue:1
ngen install Assembly2 /queue:2
ngen install Assembly3 /queue:3
작업을 사용하여 executeQueuedItems 큐에 대기 중인 작업이 동기적으로 수행되도록 할 수 있습니다. 선택적 우선 순위를 제공하는 경우 이 작업은 우선 순위가 같거나 낮은 큐에 대기 중인 작업에만 영향을 줍니다. 기본 우선 순위는 3이므로 다음 Ngen.exe 명령은 대기 중인 모든 작업을 즉시 처리하고 완료될 때까지 반환하지 않습니다.
ngen executeQueuedItems
동기 명령은 Ngen.exe 의해 실행되며 네이티브 이미지 서비스를 사용하지 않습니다. 네이티브 이미지 서비스가 실행되는 동안 Ngen.exe 사용하여 작업을 실행할 수 있습니다.
서비스 종료
옵션을 포함하는 /queue Ngen.exe 명령을 실행하여 시작한 후에는 모든 작업이 완료될 때까지 서비스가 백그라운드에서 실행됩니다. 서비스는 필요한 경우 여러 다시 부팅을 계속할 수 있도록 상태를 저장합니다. 서비스에서 대기 중인 작업이 더 이상 없음을 감지하면 다음번에 컴퓨터가 부팅될 때 다시 시작되지 않도록 상태를 다시 설정한 다음 자체적으로 종료됩니다.
클라이언트와 서비스 상호 작용
.NET Framework 버전 2.0에서 네이티브 이미지 서비스와의 상호 작용은 명령줄 도구 Ngen.exe통해서만 가능합니다. 설치 스크립트에서 명령줄 도구를 사용하여 네이티브 이미지 서비스에 대한 작업을 큐에 대기시키고 서비스와 상호 작용합니다.
참고하십시오
- Tools
- 관리되는 실행 프로세스
- 런타임에서 어셈블리를 찾는 방법
- 개발자 명령줄 셸
.NET