네이티브 이미지 생성기(Ngen.exe) 레거시 구문
업데이트: 2007년 11월
이 항목의 정보는 .NET Framework 버전 1.0 및 1.1 사용자를 위해 제공됩니다. 버전 2.0 구문은 네이티브 이미지 생성기(Ngen.exe)를 참조하십시오.
네이티브 이미지 생성기는 관리되는 어셈블리에서 네이티브 이미지를 만들어 로컬 컴퓨터의 네이티브 이미지 캐시에 설치합니다. 네이티브 이미지 캐시는 전역 어셈블리 캐시의 예약된 영역입니다. 어셈블리에 대해 네이티브 이미지를 생성한 후에는 런타임이 어셈블리를 실행할 때마다 자동으로 해당 네이티브 이미지를 사용합니다. 따라서 추가 절차를 수행하여 런타임이 네이티브 이미지를 사용하도록 할 필요가 없습니다. 어셈블리에서 Ngen.exe를 실행하면 코드와 데이터 구조를 동적으로 생성하는 대신 네이티브 이미지 캐시에서 이를 복원하기 때문에 어셈블리를 더 빨리 로드하고 실행할 수 있습니다.
ngen [options] [assemblyName |assemblyPath ]
매개 변수
인수 |
설명 |
---|---|
assemblyName |
네이티브 이미지를 생성할 어셈블리의 이름입니다. 해당 어셈블리가 현재 디렉터리에 있어야 합니다. myAssembly와 같이 부분적인 어셈블리 이름이나 myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5와 같이 완전한 어셈블리 이름을 지정할 수 있습니다. Ngen.exe가 어셈블리의 게시자 정책 파일을 찾아서 사용하게 하려면 지정된 완전한 어셈블리 이름을 사용해야 합니다. |
assemblyPath |
네이티브 이미지를 생성할 어셈블리의 명시적 경로입니다. c:\applications\myApp\myApp.exe와 같은 어셈블리의 전체 경로, ..\applications\myApp\myApp.exe와 같은 상대 경로 또는 myApp.exe와 같은 파일 이름을 지정할 수 있습니다. 어셈블리가 현재 디렉터리에 있을 때만 myApp.exe와 같이 전체 또는 상대 경로 없이 파일 이름을 지정할 수 있습니다. Ngen.exe가 어셈블리를 실행 파일로 식별하고 해당 구성 파일을 찾게 하려면 assemblyPath 인수를 사용하여 .exe 확장명으로 어셈블리를 지정해야 합니다. 명령줄에 둘 이상의 어셈블리를 지정하는 경우 한 어셈블리만 실행 파일이어야 합니다. 이 도구는 실행 파일의 바인딩 속성(응용 프로그램 기본 및 구성 파일)을 사용자가 지정한 다른 어셈블리에 적용합니다. |
옵션 |
설명 |
---|---|
/debug |
표준 디버깅 모드에서 디버거가 사용할 네이티브 이미지를 생성합니다. |
/debugopt |
공용 언어 런타임의 최적화된 디버깅 모드에서 디버거가 사용할 네이티브 이미지를 생성합니다. 이 모드를 활성화하는 방법에 대한 자세한 내용은 디버거 설명서를 참조하십시오. |
/delete [assemblyName | assemblyPath | *] |
지정된 assemblyName 또는 assemblyPath의 네이티브 이미지를 네이티브 이미지 캐시에서 삭제합니다. '*' 매개 변수를 지정하면 네이티브 이미지 캐시의 모든 네이티브 이미지가 삭제됩니다. /delete 옵션으로 매개 변수를 지정하지 않으면 오류 메시지가 표시됩니다. .NET Framework의 한 버전을 제거하면 제거 과정 중에 /delete 옵션이 사용되어 제거 중인 .NET Framework 버전의 모든 네이티브 이미지가 제거됩니다. 여기에는 설치 시 .NET Framework 어셈블리용으로 만들어진 네이티브 이미지와 사용자 지정 어셈블리용으로 사용자가 만든 네이티브 이미지도 포함됩니다. /show 옵션을 사용하여 /delete * 옵션을 지정하면 삭제된 네이티브 이미지 목록이 표시됩니다. 동일한 컴퓨터에 여러 버전의 .NET Framework를 동시에 설치할 때 네이티브 이미지를 삭제하려면 해당 네이티브 이미지를 만드는 데 사용한 같은 버전의 Ngen.exe를 사용해야 합니다. 참고 이 옵션은 Ngen.exe로 생성된 네이티브 이미지에만 적용되며 실제 어셈블리에는 영향을 주지 않습니다. |
/help |
이 도구의 명령 구문 및 옵션을 표시합니다. |
/nologo |
Microsoft 시작 배너를 표시하지 않습니다. |
/prof |
계측된 코드를 사용하는 프로파일러에서 사용할 네이티브 이미지를 생성합니다. 프로파일러에 계측된 코드가 필요한지 여부를 확인하려면 프로파일러 설명서를 참조하십시오. |
/show |
지정된 assemblyName 또는 assemblyPath의 기존 파일을 네이티브 이미지 캐시에 표시합니다. 인수를 지정하지 않은 경우에는 네이티브 이미지 캐시의 전체 내용이 표시됩니다. 이 옵션은 소스 어셈블리의 어셈블리 정의 정보 및 각 네이티브 이미지의 특수 코드 구성 옵션을 표시합니다. /delete* 옵션을 사용하여 이 옵션을 지정하면 삭제된 네이티브 이미지의 목록이 표시됩니다. |
/showversion |
Ngen.exe가 지정된 어셈블리의 네이티브 이미지를 생성하는 데 사용할 런타임 버전을 표시합니다. 동일한 컴퓨터에 여러 버전의 .NET Framework를 동시에 설치한 경우 이 옵션을 사용하여 해당 도구가 사용할 버전을 확인합니다. 여러 버전의 런타임을 실행하는 방법에 대한 자세한 내용은 Side-By-Side 실행을 참조하십시오. 참고 이 옵션은 네이티브 이미지를 생성하지 않습니다. |
/silent |
성공 메시지를 표시하지 않습니다. |
/? |
이 도구의 명령 구문 및 옵션을 표시합니다. |
설명
Ngen.exe는 표준 어셈블리 검색 규칙을 사용하여 사용자가 명령줄에 지정한 어셈블리를 찾지 않으며 사용자가 지정한 어셈블리를 현재 디렉터리에서만 찾습니다. 따라서 Ngen.exe가 어셈블리를 찾을 수 있게 하려면 작업 디렉터리를 해당 네이티브 이미지를 만들거나 해당 경로를 정확하게 지정하려는 어셈블리를 포함하는 디렉터리로 설정해야 합니다.
네이티브 이미지는 컴파일된 프로세서별 기계어 코드를 포함하는 파일입니다. Ngen.exe 가 생성하는 네이티브 이미지는 응용 프로그램 도메인 간에 공유할 수 없습니다. 따라서 응용 프로그램 도메인 간에 어셈블리를 공유해야 하는 응용 프로그램 시나리오에서는 Ngen.exe를 사용할 수 없습니다.
Ngen.exe를 사용하여 어셈블리를 미리 컴파일하면 코드를 실행하는 데 필요한 많은 작업이 미리 수행되므로 응용 프로그램의 시작 시간을 줄일 수 있습니다. 따라서 JIT 컴파일에서 소비하는 CPU 사이클로 인해 성능이 저하된다고 판단되는 클라이언트측 응용 프로그램에 대해서는 Ngen.exe를 사용하는 것이 좋습니다.
참고
Ngen.exe를 실행하려면 관리자 권한이 있어야 합니다.
응용 프로그램의 시작 시간에 영향을 주는 여러 가지 요인이 있으므로 Ngen.exe를 사용했을 때 도움이 되는 응용 프로그램을 신중히 판단해야 합니다. 어셈블리가 사용되는 환경에서 JIT 컴파일된 어셈블리와 미리 컴파일된 어셈블리 버전을 둘 다 실행해 보십시오. 이렇게 하면 각각 다른 컴파일 스키마에서 동일한 어셈블리를 실행하는 경우의 시작 시간을 비교할 수 있습니다.
어셈블리의 네이티브 이미지를 생성한 후에는 런타임이 해당 어셈블리를 실행할 때마다 자동으로 이 네이티브 이미지를 찾아서 사용합니다. 예를 들어, 디버깅 또는 프로파일링 시나리오에서 어셈블리를 실행하는 경우 런타임은 /debug, /debugopt 또는 /prof 옵션을 사용하여 생성된 네이티브 이미지를 찾습니다. 일치하는 네이티브 이미지를 찾을 수 없는 경우 런타임은 표준 JIT 컴파일로 되돌립니다.
디버깅할 수 있는 코드 특성을 포함하는 어셈블리에서 Ngen.exe를 실행하는 경우 특성 플래그에 따라 이 도구는 사용자가 /debug 또는 /debugopt 옵션을 지정한 것처럼 자동으로 코드를 생성합니다.
Ngen.exe는 어셈블리에서 생성할 수 없는 메서드를 발견하면 네이티브 이미지에서 이 메서드를 제외합니다. 런타임에서 이 어셈블리를 실행할 때 네이티브 이미지에 포함되지 않은 메서드에 대한 JIT 컴파일로 되돌아갑니다.
Ngen.exe를 사용하여 어셈블리의 네이티브 이미지를 만드는 경우 출력은 사용자가 지정한 명령줄 옵션 및 컴퓨터의 특정 설정에 따라 달라집니다. 다음 설정이 포함됩니다.
.NET Framework 버전
CPU 종류
운영 체제 버전
어셈블리의 정확한 ID(다시 컴파일하면 ID가 변경됨)
어셈블리에서 참조하는 모든 어셈블리의 정확한 ID(다시 컴파일하면 ID가 변경됨)
보안 요소
Ngen.exe는 네이티브 이미지를 생성할 때 이 정보를 기록합니다. 어셈블리를 실행하는 경우 런타임은 컴퓨터의 현재 환경과 일치하는 옵션 및 설정을 사용하여 생성된 네이티브 이미지를 찾고 일치하는 네이티브 이미지를 찾지 못하는 경우 어셈블리의 JIT 컴파일로 되돌립니다. 다음과 같이 컴퓨터 설정과 환경을 변경하면 네이티브 이미지를 사용할 수 없게 됩니다.
.NET Framework 버전
.NET Framework에 업데이트를 적용하면 Ngen.exe를 사용하여 수동으로 만든 네이티브 이미지를 모두 사용할 수 없게 됩니다. 이러한 어셈블리는 계속 실행되지만 런타임에서 어셈블리의 해당 네이티브 이미지를 로드하지 못합니다. 이러한 어셈블리의 네이티브 이미지는 수동으로 새로 만들어야 합니다.
.NET Framework는 설치한 .NET Framework 라이브러리에 대한 새로운 네이티브 이미지를 자동으로 만듭니다.
CPU 종류
컴퓨터 프로세서를 새로운 프로세서 제품군으로 업그레이드하면 네이티브 이미지 캐시에 저장된 모든 네이티브 이미지를 사용할 수 없게 됩니다.
운영 체제 버전
컴퓨터에서 실행되는 운영 체제 버전이 변경되면 네이티브 이미지 캐시에 저장되어 있는 모든 네이티브 이미지를 사용할 수 없게 됩니다.
어셈블리의 정확한 ID
어셈블리를 다시 컴파일하면 어셈블리의 해당 네이티브 이미지를 사용할 수 없게 됩니다.
어셈블리에서 참조하는 모든 어셈블리의 정확한 ID
어셈블리에서 참조하는 어셈블리를 다시 컴파일하면 어셈블리의 해당 네이티브 이미지를 사용할 수 없게 됩니다.
보안 요소
어셈블리에 이전에 부여되었던 사용 권한을 제한하도록 컴퓨터 보안 정책을 변경하면 이전에 컴파일한 해당 어셈블리의 네이티브 이미지를 사용할 수 없게 됩니다. 특히, 다음 사용 권한을 해지하면 어셈블리의 현재 네이티브 이미지를 사용할 수 없게 됩니다.
어셈블리가 파생된 클래스에서 요구하는 선언적 상속 사용 권한
어셈블리가 호출하는 메서드에서 요구하는 선언적 링크 시간 사용 권한
어셈블리에 확인할 수 없는 메서드가 포함된 경우 SkipVerification 사용 권한. 이 사용 권한에 대한 자세한 내용은 SecurityPermissionAttribute.SkipVerification 속성을 참조하십시오.
어셈블리가 PInvoke를 호출한 경우 UnmanagedCode 사용 권한 이 사용 권한에 대한 자세한 내용은 SecurityPermissionAttribute.UnmanagedCode 속성을 참조하십시오.
코드 액세스 보안을 해제한 상태로 어셈블리에 대해 Ngen.exe를 실행하면 생성된 네이티브 이미지는 코드 액세스 보안이 설정되었을 때 사용할 수 없게 됩니다. 기본적으로 코드 액세스 보안은 설정되어 있습니다.
공용 언어 런타임이 코드 액세스 보안을 관리하는 방법과 권한 사용 방법에 대한 자세한 내용은 코드 액세스 보안을 참조하십시오.
참고
공용 언어 런타임 버전 1.0에는 무효화된 네이티브 이미지의 자동 만들기 또는 삭제 기능이 없습니다. Ngen.exe를 사용하여 모든 네이티브 이미지를 직접 만들고 삭제해야 합니다.
설치 시 Ngen.exe를 사용하여 응용 프로그램의 네이티브 이미지를 생성하는 경우 응용 프로그램 파일 이름과 컴파일되었을 때 응용 프로그램이 참조한 .dll 파일의 완전하게 지정된 어셈블리 이름을 지정해야 합니다. 응용 프로그램이 참조한 DLL의 완전하게 지정된 어셈블리 이름을 제공하면 Ngen.exe는 참조된 어셈블리의 게시자 정책 파일에 액세스할 수 있습니다. 앞으로 DLL이 업데이트되고 버전 리디렉션에 게시자 정책이 사용되면 Ngen.exe는 게시자 정책을 적용합니다.
응용 프로그램에 대해 Ildasm.exe를 실행하고 해당 어셈블리의 매니페스트를 확인하여 사용하려는 완전하게 지정된 어셈블리의 이름을 알 수 있습니다. 해당 매니페스트는 응용 프로그램이 컴파일 타임에 참조한 DLL의 어셈블리 이름, 버전, culture 및 공개 키 토큰을 표시합니다. 예를 들어, myLibrary.dll, 버전 1.0.0.0, culture=neutral 및 PublicKeyToken=0038abc9deabfle5를 사용하여 컴파일된 ClientApp.exe라는 응용 프로그램의 네이티브 이미지를 만들려면 명령 ngen ClientApp.exe "myLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5"를 사용합니다.
앞의 예제에서는 myLibrary.dll이 참조하는 어셈블리의 네이티브 이미지는 생성하지 않습니다. myLibrary.dll이 참조하는 어셈블리의 완전하게 지정된 이름을 확인하려면 myLibrary.dll에 대해 Ildasm.exe를 실행합니다. 예를 들어, myLibrary.dll에 대해 Ildasm.exe를 실행하고 해당 응용 프로그램이 myMath.dll, 버전 1.0.0.0, culture=neutral 및 PublicKeyToken=0039def8abcbste7을 참조한다고 확인되면 다음 명령을 사용하여 ClientApp.exe의 어셈블리 참조를 포함하는 전체 트리의 네이티브 이미지를 생성합니다.
ngen ClientApp.exe "myLibrary, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5", "myMath, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0039def8abcbste7".
이 형식에 대한 자세한 내용은 이 항목 뒷부분의 예제 단원을 참조하십시오.
응용 프로그램의 제거 프로세스에서는 /delete [assemblyName | assemblyPath] 옵션을 사용하여 응용 프로그램 설치 시 생성된 네이티브 이미지를 제거해야 합니다. assemblyName 또는 assemblyPath 매개 변수를 사용하여 삭제할 특정 네이티브 이미지를 지정해야 합니다. **/delete ***를 지정하면 네이티브 이미지 캐시의 모든 네이티브 이미지가 제거되며 매개 변수 없이 /delete 옵션을 지정하면 오류가 발생합니다.
예제
다음 명령은 현재 디렉터리에 있는 ClientApp.exe의 네이티브 이미지를 생성합니다. 응용 프로그램에 대해 구성 파일이 존재하는 경우 Ngen.exe는 해당 파일을 사용합니다. 이 도구는 ClientApp.exe가 참조하는 DLL에 대한 네이티브 이미지는 생성하지 않습니다.
ngen ClientApp.exe
ClientApp.exe가 두 개의 DLL, myLibOne.dll 및 myLibTwo.dll을 직접 참조하면 이러한 DLL의 완전하게 지정된 어셈블리 이름을 Ngen.exe에 제공하여 해당 네이티브 이미지를 생성해야 합니다. ClientApp.exe에 대해 Ildasm.exe를 실행하여 참조된 DLL의 완전하게 지정된 어셈블리 이름을 확인합니다. 이 예제의 목적에 맞게 myLibOne.dll 및 myLibTwo.dll의 완전하게 지정된 어셈블리 이름으로 "myLibOne, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5" 및 "myLibTwo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5"가 사용됩니다. 이 정보를 사용하여 다음 명령은 ClientApp.exe, myLibOne.dll 및 myLibTwo.dll의 네이티브 이미지를 생성합니다. ClientApp.exe에 대해 구성 파일이 존재하는 경우 Ngen.exe는 해당 파일을 사용합니다. myLibOne.dll 또는 myLibTwo.dll에 대해 게시자 정책 파일이 존재하는 경우 Ngen.exe는 해당 파일을 사용합니다.
ngen ClientApp.exe "myLibOne, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5", "myLibTwo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5"
앞의 예제에서 DLL myLibOne.dll 및 myLibTwo.dll은 다른 어셈블리를 참조할 수 있습니다. 참조된 어셈블리의 완전하게 지정된 어셈블리 이름을 확인하려면 myLibOne.dll 및 myLibTwo.dll.에 대해 Ildasm.exe를 실행합니다. 이 예제에 목적에 맞게 myLibOne.dll은 다른 어셈블리를 참조하지 않으며 myLibTwo.dll은 "myMath, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0039def8abcbste7"을 참조한다고 가정합니다. 이 정보를 사용하여 다음 명령은 응용 프로그램의 어셈블리 참조를 포함하는 전체 트리에 대한 네이티브 이미지를 생성합니다.
ngen ClientApp.exe "myLibOne, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5", "myMath, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0039def8abcbste7", "myLibTwo, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5"
다음 명령은 지정된 경로를 사용하여 myAssembly.exe의 네이티브 이미지를 생성합니다.
ngen c:\myfiles\myAssembly.exe
다음 명령은 지정된 경로를 사용하여 myLibrary.dll,의 네이티브 이미지를 생성합니다.
ngen c:\myfiles\myLibrary.dll
Ngen.exe는 네이티브 이미지 캐시를 조회하여 부분 어셈블리 이름으로 지정된 어셈블리를 삭제합니다. 다음 명령을 사용하여 이름이 myAssembly인 모든 네이티브 이미지를 삭제합니다.
ngen /delete myAssembly
다음 명령을 사용하여 완전하게 지정된 어셈블리 이름을 갖는 네이티브 이미지 myAssembly를 삭제합니다.
ngen /delete "myAssembly, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5"
다음 명령은 네이티브 이미지 캐시에서 모든 네이티브 이미지를 표시합니다.
ngen /show
다음 명령은 네이티브 이미지 캐시에서 이름이 myAssembly인 모든 네이티브 이미지를 표시합니다.
ngen /show myAssembly
다음 명령은 네이티브 이미지 캐시에서 이름이 myAssembly이고 버전이 1.0인 모든 네이티브 이미지를 표시합니다.
ngen /show "myAssembly, version=1.0.0.0"