包含在軟件
名字: Windows XP Home Edition, Deutsch
執(zhí)照: 商業(yè)
信息鏈接: http://www.microsoft.com/windowsxp/
文件細節(jié)
文件道路: C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322 \ ngen.exe
文件日期: 2003-02-20 18:09:46
版本: 1.1.4322.573
文件大小: 73.728 字節(jié)
檢查和和文件hashes
CRC32: 8EA323F
MD5: FDA9 049A C48B 83A1 521A A1EF 419B 19AA
SHA1: CB59 6BE4 9A22 4556 7C98 152F EF97 4DA9 9384 76F2
版本資源信息
評論: Microsoft Common Language Runtime native compiler
公司名稱: Microsoft Corporation
文件描述: Microsoft Common Language Runtime native compiler
文件旗子: SPECIAL-BUILD
文件操作系統(tǒng): 32-bit Windows
文件類型: Dynamic Link Library (DLL)
文件版本: 1.1.4322.573
內部名: ngen.exe
法律版權: Copyright © Microsoft Corporation 1998-2002. All rights reserved.
法律商標: Microsoft® is a registered trademark of Microsoft Corporation. Windows(TM) is a trademark of Microsoft Corporation
原始的文件名: ngen.exe
產品名稱: Microsoft .NET Framework
產品版本: 1.1.4322.573
本機映像生成器(Ngen.exe)
.NET Framework 工具
本機映像生成器 (Ngen.exe)
本機映像生成器 (Ngen.exe) 是一個提高托管應用程序性能的工具。Ngen.exe 創(chuàng)建本機映像(包含經(jīng)編譯的特定于處理器的機器代碼的文件),并將它們安裝到本地計算機上的本機映像緩存中。運行庫可從緩存中使用本機映像,而不是使用實時 (JIT) 編譯器編譯原始程序集。
在 .NET Framework 2.0 版中,Ngen.exe 有了很大變化:
安裝程序集時還將安裝其依賴項,從而簡化了 Ngen.exe 的語法。
現(xiàn)在可以在應用程序域之間共享本機映像。
可利用新增操作 update 重新創(chuàng)建已經(jīng)失效的映像。
操作可由計算機上使用空閑時間生成和安裝映像的服務推遲執(zhí)行。
消除了一些導致映像無效的因素。
有關如何使用 Ngen.exe 和本機映像服務的其他信息,請參見
本機映像服務。
注意
在
本機映像生成器 (Ngen.exe) 舊式語法中可以找到 .NET Framework 1.0 和 1.1 版的 Ngen.exe 語法。
ngen <action> [options]ngen /? | /help
操作下表說明了每個操作的語法。有關 actionArguments 各部分的說明,請參見
參數(shù)、
方案和
配置表。
選項表描述了 options 和幫助開關。
操作說明
install [assemblyName | assemblyPath] [scenarios] [config] [/queue[:{1|2|3}]]
生成程序集及其依賴項的本機映像,并在本機映像緩存中安裝這些映像。
如果指定了 /queue,則操作將排隊等待本機映像服務。默認優(yōu)先級是 3。
uninstall [assemblyName | assemblyPath | *] [scenarios] [config]
將程序集及其依賴項的本機映像從本機映像緩存中刪除。
若要卸載單個映像及其依賴項,可使用與安裝此映像時相同的命令行參數(shù)。
update [/queue]
更新已無效的本機映像。
如果指定了 /queue,則更新將排隊以等待本機映像服務。更新的優(yōu)先級總是預先設定為 3,因此它們在計算機空閑時運行。
display [assemblyName | assemblyPath]
顯示程序集及其依賴項的本機映像的狀態(tài)。
如果未提供參數(shù),則顯示本機映像緩存中的所有內容。
executeQueuedItems [1|2|3]
執(zhí)行排隊的編譯作業(yè)。
如果指定了優(yōu)先級,則執(zhí)行具有較高或同等優(yōu)先級的編譯作業(yè)。如果未指定優(yōu)先級,則執(zhí)行所有排隊的編譯作業(yè)。
queue {pause | continue | status}
暫停本機映像服務,允許暫停的服務繼續(xù),或查詢服務狀態(tài)。
參數(shù)參數(shù)說明
assemblyName
程序集的名稱??商峁┏绦蚣牟糠置Q(如 myAssembly),也可提供完整的顯示名稱(如 myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5)。
每個 Ngen.exe 命令行只能指定一個程序集。
assemblyPath
程序集的顯式路徑。可指定完整路徑或相對路徑。
如果指定文件名而不指定路徑,則程序集必須位于當前目錄中。
每個 Ngen.exe 命令行只能指定一個程序集。
方案方案說明
/Debug
生成可在調試器下使用的本機映像。
/Profile
生成可在探查器下使用的本機映像。
/NoDependencies
生成指定方案選項所需的最小數(shù)目的本機映像。
配置配置說明
/ExeConfig:exePath
使用指定的可執(zhí)行程序集的配置。
綁定到依賴項時,Ngen.exe 需要作出與加載程序相同的決策。如果在運行時使用
Load 方法加載共享組件,應用程序的配置文件決定了為該共享組件加載的依賴項,例如,所加載依賴項的版本。/ExeConfig 開關就運行時將加載哪些依賴項向 Ngen.exe 給出指導。
/AppBase:directoryPath
查找依賴項時,使用指定目錄作為應用程序基礎。
選項選項說明
/nologo
禁止顯示 Microsoft 啟動版權標志。
/silent
禁止顯示成功消息。
/verbose
顯示詳細的調試信息。
注意
由于操作系統(tǒng)限制,此選項顯示的附加信息比在 Windows 98 和 Windows Millennium Edition 上顯示的少。
/help, /?
顯示當前版本的命令語法和選項。
備注若要運行 Ngen.exe,您必須具有管理特權。
Ngen.exe 為指定程序集及其所有依賴項生成本機映像。依賴項是根據(jù)程序集清單中的引用來確定的。僅當應用程序使用反射(例如通過調用System.Reflection.Assembly.Load 方法)來加載依賴項的情況下才需要單獨安裝依賴項。
要點
不要將
System.Reflection.Assembly.LoadFrom 方法用于本機映像。使用此方法加載的映像不能由執(zhí)行上下文中的其他程序集使用。
Ngen.exe 維護著一個與依賴項有關的計數(shù)。例如,假設本機映像緩存中同時安裝了 MyAssembly.exe 和 YourAssembly.exe,而且它們都具有對OurDependency.dll 的引用。如果卸載了 MyAssembly.exe,則不會卸載 OurDependency.dll。只有當 YourAssembly.exe 也被卸載時才會將其移除。
如果為全局程序集緩存中的程序集生成本機映像,請指定其顯示名稱。請參見
System.Reflection.Assembly.FullName。
Ngen.exe 生成的本機映像可以在應用程序域之間共享。這意味著,在要求在應用程序域之間共享程序集的應用程序方案中可以使用 Ngen.exe。若要指定域非特定性:
將
LoaderOptimizationAttribute 屬性應用于應用程序。
為新的應用程序域創(chuàng)建安裝信息時,設置
System.AppDomainSetup.LoaderOptimization 屬性。
將同一個程序集加載到多個應用程序域中時,總是使用非特定于域的代碼。如果本機映像在已加載到共享域之后又被加載到非共享的應用程序域中,則該映像將無法使用。
注意
非特定于域的代碼無法卸載,并且性能可能會稍微降低,尤其是在訪問靜態(tài)成員時。
為不同的方案生成映像在您生成一個程序集的本機映像后,每當運行庫運行該程序集時,都會自動嘗試找到并使用該本機映像。根據(jù)使用方案的不同,可生成多個映像。
例如,如果您在調試或分析方案中運行程序集,則運行庫將查找利用 /Debug 或 /Profile 選項生成的本機映像。如果運行庫無法找到匹配的本機映像,它將恢復為標準的 JIT 編譯。調試本機映像的唯一方式是使用 /Debug 選項創(chuàng)建本機映像。
uninstall 操作也能識別方案,因此您可以卸載所有方案或只卸載選擇的方案。
確定何時使用本機映像本機映像可從兩方面提高性能:改善內存使用情況和減少啟動時間。
注意
本機映像的性能取決于很多因素,這些因素使得分析難以進行,如代碼和數(shù)據(jù)訪問模式,有多少調用跨模塊邊界進行,以及多少依賴項已由其他應用程序加載。確定本機映像是否對應用程序有利的唯一方式是在關鍵部署方案中仔細進行性能測量。
改善內存使用情況
當代碼在進程間共享時,本機映像可顯著改善內存使用情況。本機映像為 Windows PE 文件,因此一個 .dll 文件的單個副本可由多個進程共享;而 JIT 編譯器生成的本機代碼存儲在私有內存中,并且不可共享。
運行于終端服務下的應用程序也可從共享代碼頁中獲益。
此外,不加載 JIT 編譯器會為每個應用程序實例節(jié)省固定量的內存。
更快的應用程序啟動速度
使用 Ngen.exe 預編譯程序集可減少某些應用程序的啟動時間。通常,如果應用程序共享組件程序集,則可從中獲益,因為在第一個應用程序啟動之后,共享組件即已加載,可供后續(xù)應用程序使用。而冷啟動(應用程序中的所有程序集必須從硬盤上加載)則不會從本機映像中獲得相同的益處,因為硬盤訪問時間占了很大比重。
硬綁定可影響啟動時間,因為硬綁定至主應用程序程序集的所有映像必須同時加載。
注意
如果您有強命名的共享組件,則請將它們放置在全局程序集緩存中。加載程序對未處于全局程序集緩存中的強命名程序集執(zhí)行額外驗證,實際抵消了使用本機映像在啟動時間方面獲得的任何改善。
程序集基址的重要性
因為本機映像為 Windows PE 文件,所以它們和其他可執(zhí)行文件一樣有著相同的重定基址問題。如果采用硬綁定,則重定位的性能開銷甚至更顯著。
若要設置本機映像的基址,請使用編譯器的相應選項設置程序集的基址。Ngen.exe 對本機映像使用此基址。
注意
本機映像大于創(chuàng)建它時所基于的托管程序集?;繁仨氝M行計算以允許使用這些更大的大小。
可使用 dumpbin.exe 之類的工具查看本機映像的首選基址。
使用注意事項摘要
下面的常規(guī)注意事項和應用程序注意事項可能有助于您決定是否對應用程序本機映像進行評估:
本機映像的加載速度比 MSIL 更快,因為本機映像不必執(zhí)行很多啟動操作,如 JIT 編譯和類型安全驗證。
本機映像需要較小的初始工作集,因為它不需要 JIT 編譯器。
本機映像允許在進程間共享代碼。
本機映像需要占用比 MSIL 程序集更大的硬盤空間,并且可能需要相當長的時間才能生成。
必須維護本機映像。
在提供原始程序集或原始程序集的某個依賴項后,需要重新生成映像。
一個程序集可能需要多個本機映像,分別用在不同應用程序或不同方案中。例如,兩個應用程序中的配置信息可能為同一個依賴程序集生成不同的綁定方案。
必須由管理員(也就是從 Administrators 組中的某個 Windows 帳戶)來生成本機映像。
除了這些常規(guī)注意事項之外,在確定本機映像是否可提供性能益處時,必須考慮應用程序的性質:
如果應用程序運行于使用很多共享組件的環(huán)境中,本機映像允許多個進程共享組件。
如果應用程序使用多個應用程序域,本機映像允許跨域共享代碼頁。
注意
在 .NET Framework 1.0 和 1.1 版中,本機映像不能跨應用程序域共享。而在 2.0 版中則可以。
如果應用程序將在終端服務器下運行,本機映像允許共享代碼頁。
編譯為本機映像通常有利于大型應用程序。小型應用程序通常不會獲益。
對于長時間運行的應用程序,運行時 JIT 編譯的性能略高于本機映像。(硬綁定某種程度上可減少這一性能差別。)
硬綁定硬綁定增加吞吐量并減少本機映像的工作集大小。硬綁定的缺點是硬綁定到程序集的所有映像在加載程序集時必須都加載。對于大型應用程序,這會大大增加啟動時間。
硬綁定適合于在所有應用程序性能關鍵的方案中加載的依賴項。與本機映像使用情況的任何方面一樣,仔細測量性能是確定硬綁定是否可改善應用程序性能的唯一方式。
DependencyAttribute 和
DefaultDependencyAttribute 屬性可使您向 Ngen.exe 提供硬綁定提示。
注意
這些屬性是對 Ngen.exe 的提示,而不是命令。使用這些提示不保證進行硬綁定。這些屬性的含義在將來的版本中可能會更改。
為依賴項指定綁定提示
將 DependencyAttribute 應用于程序集可指示加載指定依賴項的可能性。
System.Runtime.CompilerServices.LoadHint.Always 指示適合進行硬綁定,
Default 指示應使用依賴項的默認提示,而
Sometimes 則指示不適合使用硬綁定。
下面的代碼顯示有兩個依賴項的程序集的屬性。第一個依賴項 (Assembly1) 適合于進行硬綁定,而第二個 (Assembly2) 不適合進行硬綁定。
Visual Basic
Imports System.Runtime.CompilerServices<Assembly:DependencyAttribute("Assembly1", LoadHint.Always)><Assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)>
C#
using System.Runtime.CompilerServices;[assembly:DependencyAttribute("Assembly1", LoadHint.Always)][assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)]
C++
using namespace System::Runtime::CompilerServices;[assembly:DependencyAttribute("Assembly1", LoadHint.Always)];[assembly:DependencyAttribute("Assembly2", LoadHint.Sometimes)];
程序集名稱不包括文件擴展名??墒褂蔑@示名稱。
為程序集指定默認綁定提示
只有某些程序集需要默認綁定提示:這些程序集將由依賴于它們的任何應用程序直接并經(jīng)常使用。以System.Runtime.CompilerServices.LoadHint.Always 將 DefaultDependencyAttribute 應用于這樣的程序集可指定應使用硬綁定。
注意
不應將 DefaultDependencyAttribute 應用于不屬于此類別的 .dll 程序集,因為以System.Runtime.CompilerServices.LoadHint.Always 之外的其他值應用該屬性的效果與根本不應用該屬性相同。
Microsoft 使用 DefaultDependencyAttribute 指定硬綁定為 .NET Framework 中極少數(shù)程序集(如 mscorlib.dll)的默認綁定。
疑難解答若要確認應用程序正在使用本機映像,可使用
程序集綁定日志查看器 (Fuslogvw.exe)。在綁定日志查看器窗口上,選擇“日志類別”框中的“本機映像”。Fuslogvw.exe 提供了有關為什么拒絕本機映像的信息。
可使用
JitCompilationStart 托管調試助手 (MDA) 確定 JIT 編譯器何時開始編譯函數(shù)。
推遲處理超大型應用程序的本機映像生成過程可能需要相當長的時間。同樣,更改共享組件或更改計算機設置可能需要更新很多本機映像。install 和 update操作有一個 /queue 選項,該選項將該操作排入隊列,以由本機映像服務推遲執(zhí)行。此外,Ngen.exe 具有 queue 和 executeQueuedItems操作,這些操作提供了對本機映像服務的某些控制。有關更多信息,請參見
本機映像服務。
本機映像和 JIT 編譯如果 Ngen.exe 在程序集中遇到它無法生成的任何方法,則它會將這些方法從本機映像中排除。當運行庫執(zhí)行此程序集時,對于那些不包括在本機映像中的方法,它將恢復為 JIT 編譯。
此外,如果程序集已更新,或者本機映像出于任何原因已失效,則不會使用本機映像。
無效映像
當您使用 Ngen.exe 創(chuàng)建程序集的本機映像時,輸出取決于您指定的命令行選項以及計算機上的某些設置。這些設置包括:
.NET Framework 的版本。
操作系統(tǒng)的版本(在從 Windows 9x 系列更改為 Windows NT 系列的情況下)。
程序集的確切標識(重新編譯將更改標識)。
程序集引用的所有程序集的確切標識(重新編譯將更改標識)。
安全因素。
Ngen.exe 在生成本機映像時記錄這些信息。當您執(zhí)行程序集時,運行庫將查找用匹配計算機的當前環(huán)境的選項和設置生成的本機映像。如果運行庫沒有找到匹配的本機映像,它將恢復為程序集的 JIT 編譯。對計算機的設置和環(huán)境進行以下更改會導致本機映像失效:
.NET Framework 的版本。
如果將更新應用于 .NET Framework,則使用 Ngen.exe 創(chuàng)建的所有本機映像都將失效。因此,.NET Framework 的所有更新都執(zhí)行 Ngen Update 命令,以確保重新生成所有的本機映像。.NET Framework 為它安裝的 .NET Framework 庫自動創(chuàng)建新的本機映像。
操作系統(tǒng)的版本(在從 Windows 9x 系列更改為 Windows NT 系列的情況下)。
例如,如果計算機上運行的操作系統(tǒng)的版本從 Windows 98 更改為 Windows XP,則存儲在本機映像緩存中的所有本機映像都將失效。但是,如果將操作系統(tǒng)從 Windows 2000 更改為 Windows XP,則這些映像將不會失效。
程序集的確切標識。
如果重新編譯程序集,則程序集的相應本機映像將失效。
程序集引用的任何程序集的確切標識。
如果更新一個托管程序集,則所有直接或間接依賴該程序集的本機映像都將失效,并需要重新生成。這既包括一般引用,也包括硬綁定依賴項。每當應用軟件更新,安裝程序就應執(zhí)行 Ngen Update 命令,以確保重新生成所有依賴的本機映像。
安全因素。
更改計算機安全策略以限制先前授予某個程序集的權限,這樣會導致該程序集的先前編譯的本機映像失效。
有關公共語言運行庫如何管理代碼訪問安全以及如何使用權限的詳細信息,請參見
代碼訪問安全性示例下面的命令為當前目錄中的 ClientApp.exe 生成本機映像,并在本機映像緩存中安裝該映像。如果該程序集存在配置文件,Ngen.exe 將使用它。此外,還會為 ClientApp.exe 所引用的任何 .dll 文件生成本機映像。
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 行為的更改,在這些版本中,應用程序基目錄設置為當前目錄。
程序集可以具有不帶引用的依賴項(例如,它使用 System.Reflection.Assembly.Load 方法加載 .dll 文件)。您可以使用 /ExeConfig,使用應用程序程序集的配置信息來為這樣的 .dll 文件創(chuàng)建本機映像。下面的命令使用 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
若要在全局程序集緩存中為程序集創(chuàng)建本機映像,請使用程序集的顯示名稱。例如:
ngen install "ClientApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=3c7ba247adcd2081, processorArchitecture=MSIL"
NGen.exe 會為您安裝的每個方案生成一個單獨的映像集。例如,下面的命令為正常操作生成一個完整的本機映像集,為調試生成另一個完整的映像集,并為探測生成第三個映像集:
ngen install MyApp.exengen install MyApp.exe /debugngen install MyApp.exe /profile
顯示本機映像緩存
在緩存中安裝本機映像后,就可使用 Ngen.exe 顯示這些映像。下面的命令顯示本機映像緩存中的所有本機映像。
ngen display
display 操作首先列出所有的根程序集,然后列出計算機上的所有本機映像。
使用程序集的簡單名稱僅顯示該程序集的信息。下面的命令顯示本機映像緩存中與部分名稱 MyAssembly 匹配的所有本機映像、其依賴項以及所有依賴MyAssembly 的根:
ngen display MyAssembly
了解哪些根依賴于共享組件程序集對于在共享組件升級后確定 update 操作的影響非常有用。
如果指定了程序集的文件擴展名,則必須指定路徑,或從包含該程序集的目錄執(zhí)行 Ngen.exe:
ngen display c:\myApps\MyAssembly.exe
下面的命令顯示本機映像緩存中名為 MyAssembly 、版本為 1.0.0.0 的所有本機映像。
ngen display "myAssembly, version=1.0.0.0"
更新映像
映像通常是在共享組件更新之后進行更新的。若要更新本身發(fā)生更改或者其依賴項發(fā)生了更改的所有本機映像,請不帶任何參數(shù)使用 update 操作。
ngen update
更新所有映像可能會耗費很長時間。使用 /queue 選項可對更新操作進行排隊以等候本機映像服務執(zhí)行。有關 /queue 選項和安裝優(yōu)先級的更多信息,請參見
本機映像服務。
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 操作一樣,如果提供了擴展名,則需要從包含該程序集的目錄執(zhí)行 Ngen.exe,或者指定完整路徑。
有關本機映像服務的示例,請參見
本機映像服務。