本機映像產生器建立託管程式集的本機映像,並且將該映像安裝到本機電腦的本機映像緩衝中。本機映像緩衝是全域組件快取的保留地區。一旦您為某個程式集建立了本機映像,運行庫在每次運行該程式集時就會自動使用該本機映像。不必執行任何其他的過程就可使運行庫使用本機映像。在程式集上運行 Ngen.exe 可以提高程式集的載入和執行速度,原因是它可以從本機映像緩衝中還原代碼和資料結構,而不是動態產生它們。
ngen [options] [assemblyName |assemblyPath ]參數 說明
assemblyName 為其產生原生映像 (NGen)的程式集的名稱。程式集必須位於目前的目錄中。可以提供部分指定的程式集名稱(如 myAssembly)或完全指定的程式集名稱(如 myAssembly, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0038abc9deabfle5)。如果希望 Ngen.exe 找到並使用程式集的發行者策略檔案,必須使用完全指定的程式集名稱。
assemblyPath 為其產生原生映像 (NGen)的程式集的顯式路徑。可以指定程式集的完全路徑(如 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) 執行。
注意 此選項不產生原生映像 (NGen)。
/silent 取消顯示成功訊息。
/? 顯示該工具的命令文法和選項。
備忘
Ngen.exe 不使用標準程式集探測規則來定位您在命令列上指定的程式集。Ngen.exe 只在目前的目錄中尋找您指定的程式集。因此,要使 Ngen.exe 可以找到程式集,應該將工作目錄設定為要為其建立本機映像的程式集所在的目錄,或者指定程式集的確切路徑。
本機映像是包含已編譯的處理器特定的機器碼的檔案。注意,Ngen.exe 產生的本機映像不能在應用程式定義域之間共用。因此,在要求在應用程式定義域之間共用組件的應用程式方案(如 ASP.NET)中不能使用 Ngen.exe。
通過 Ngen.exe 先行編譯程式集可以減少應用程式的啟動時間,因為執行代碼所需的大量工作已事先完成。因此,如果您已確定導致效能降低的原因在於用戶端應用程式中 JIT 編譯所消耗的 CPU 週期,最好將 Ngen.exe 用於用戶端應用程式。
因為有許多因素都會影響應用程式的啟動時間,所以應仔細判斷哪些應用程式將從使用 Ngen.exe 中受益。為此,應進行以下實驗:在將使用候選程式集的環境中運行該程式集的 JIT 編譯版本和先行編譯版本。這將使您可以比較在不同的編譯方案下,執行同一個程式集的啟動時間。
注意 若要運行 Ngen.exe,您必須具有管理員特權。
在您產生一個程式集的本機映像後,每當運行庫運行該程式集時,都會自動嘗試找到並使用該本機映像。例如,如果您在調試或分析方案中運行程式集,運行庫將尋找由 /debug、/debugopt 或 /prof 選項產生的本機映像。如果運行庫無法找到匹配的本機映像,它將恢複為標準的 JIT 編譯。
如果您在具有可調試代碼屬性的程式集上運行 Ngen.exe,根據該屬性的標誌,該工具會自動產生代碼,就像已經指定了 /debug 或 /debugopt 選項一樣。
如果 Ngen.exe 在程式集中遇到它無法產生的任何方法,則它會將這些方法從本機映像中排除。當運行庫執行此程式集時,對於那些不包括在本機映像中的方法,它將迴轉到 JIT 編譯。
當您使用 Ngen.exe 來建立程式集的本機映像時,輸出取決於您指定的命令列選項以及電腦上的某些設定。這些設定包括:
.NET Framework 的版本。
CPU 類型。
作業系統的版本。
程式集的確切標識(重新編譯將更改標識)。
程式集引用的所有程式集的確切標識(重新編譯將更改標識)。
安全因素。
Ngen.exe 在產生原生映像 (NGen)時記錄這些資訊。當您執行程式集時,運行庫將尋找用匹配電腦的當前環境的選項和設定產生的本機映像。如果運行庫沒有找到匹配的本機映像,它將恢複為程式集的 JIT 編譯。對電腦的設定和環境進行以下更改會導致本機映像失效:
.NET Framework 的版本。
如果將Hotfix、QFE 或更新應用於 .NET Framework,則使用 Ngen.exe 手動建立的所有本機映像都將失效。這些程式集仍可以運行,但運行庫不會載入程式集的相應本機映像。您必須為這些程式集手動建立新的本機映像。
.NET Framework 為它安裝的 .NET Framework 庫自動建立新的本機映像。
CPU 類型。
如果將電腦的處理器升級到新的處理器系列,則儲存在本機映像緩衝中的所有本機映像都將失效。
作業系統的版本。
如果電腦上啟動並執行作業系統的版本發生更改,則儲存在本機映像緩衝中的所有本機映像都將失效。
程式集的確切標識。
如果重新編譯器集,則程式集的相應本機映像將失效。
程式集引用的任何程式集的確切標識。
如果重新編譯某個程式集引用的任何程式集,則該程式集的相應本機映像將失效。
安全因素。
更改電腦安全性原則以限制先前授予某個程式集的許可權,這樣會導致該程式集的先前編譯的本機映像失效。具體說來,撤消下列任何許可權都會導致程式集的當前本機映像失效:
派生程式集的類所要求的聲明性繼承許可權。
程式集調用的方法所要求的聲明性連結時許可權。
SkipVerification 許可權(如果程式集包含任何無法驗證的方法)。有關此許可權的更多資訊,請參見 SecurityPermissionAttribute.SkipVerification 屬性。
UnmanagedCode 許可權(如果程式集進行任何 PInvoke 調用)。有關此許可權的更多資訊,請參見 SecurityPermissionAttribute.UnmanagedCode 屬性。
如果在關閉了代碼訪問安全的程式集上運行 Ngen.exe,則它產生的本機映像將在開啟代碼訪問安全時失效。注意,預設情況下,代碼訪問安全是開啟的。
有關公用語言運行庫如何管理代碼訪問安全以及如何使用許可權的詳細資料,請參見程式碼存取安全性
注意 在公用語言運行庫 1.0 版中,不自動建立或刪除失效的本機映像。您必須使用 Ngen.exe 手動建立或刪除所有本機映像。
如果使用 Ngen.exe 在安裝時產生應用程式的本機映像,必須指定應用程式的檔案名稱,以及應用程式在編譯時間引用的 .DLL 檔案的完全指定程式集名稱。提供應用程式引用的 DLL 檔案的完全指定程式集名稱,可使 Ngen.exe 能夠訪問所引用的程式集的發行者策略檔案。將來,如果更新 DLL 檔案並使用發行者策略重新導向版本,Ngen.exe 將應用發行者策略。
通過在應用程式上運行 Ildasm.exe 並查看其資訊清單,可以獲得要使用的完全指定程式集名稱。該清單顯示了應用程式在編譯時間引用的 DLL 檔案的程式集名稱、版本、地區性和公開金鑰標記。例如,如果想為一個名為 ClientApp.exe 的應用程式建立本機映像,而該應用程式是用版本為 1.0.0.0、地區性為非特定語言、公開金鑰標記為 0038abc9deabfle5 的 myLibrary.DLL 檔案編譯的,則請使用命令 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,並確定它引用版本為 1.0.0.0、地區性為非特定語言、公開金鑰標記為 0039def8abcbste7 的 myMath.dll,請使用下面的命令為 ClientApp.exe 的整個程式集引用分類樹產生原生映像 (NGen)。
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)。如果該應用程式存在設定檔,Ngen.exe 將使用它。該工具不會為 ClientApp.exe 引用的任何 DLL 產生原生映像 (NGen)。
ngen ClientApp.exe如果 ClientApp.exe 直接引用兩個 DLL(myLibOne.dll 和 myLibTwo.dll),則必須為 Ngen.exe 提供這些 DLL 的完全指定程式集名稱,才能為它們產生原生映像 (NGen)。對 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)。
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.dllNgen.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"
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/shootero/articles/571337.aspx