ngen本機映像生成器

2021-04-02 11:06:54 字數 4760 閱讀 6041

本機映像生成器建立託管程式集的本機映像,並且將該映像安裝到本地計算機的本機映像快取中。本機映像快取是全域性程式集快取的保留區域。一旦您為某個程式集建立了本機映像,執行庫在每次執行該程式集時就會自動使用該本機映像。不必執行任何其他的過程就可使執行庫使用本機映像。在程式集上執行 ngen.exe 可以提高程式集的載入和執行速度,原因是它可以從本機映像快取中還原**和資料結構,而不是動態生成它們。

ngen[options] [assemblyname |assemblypath ]
引數

說明assemblyname

為其生成本機映像的程式集的名稱。程式集必須位於當前目錄中。可以提供部分指定的程式集名稱(如myassembly)或完全指定的程式集名稱(如myassembly, version=2.0.0.0, culture=neutral, publickeytoken=0038abc9deabfle5)。如果希望 ngen.exe 找到並使用程式集的發行者策略檔案,必須使用完全指定的程式集名稱。

assemblypath

若要使 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 預編譯程式集可以減少應用程式的啟動時間,因為執行**所需的大量工作已事先完成。因此,如果您已確定導致效能降低的原因在於客戶端應用程式中 jit 編譯所消耗的 cpu 週期,最好將 ngen.exe 用於客戶端應用程式。

因為有許多因素都會影響應用程式的啟動時間,所以應仔細判斷哪些應用程式將從使用 ngen.exe 中受益。為此,應進行以下試驗:在將使用候選程式集的環境中執行該程式集的 jit 編譯版本和預編譯版本。這將使您可以比較在不同的編譯方案下,執行同乙個程式集的啟動時間。

注意若要執行 ngen.exe,您必須具有管理員特權。
在您生成乙個程式集的本機映像後,每當執行庫執行該程式集時,都會自動嘗試找到並使用該本機映像。例如,如果您在除錯或分析方案中執行程式集,執行庫將查詢由/debug/debugopt/prof選項生成的本機映像。如果執行庫無法找到匹配的本機映像,它將恢復為標準的 jit 編譯。

如果您在具有可除錯**屬性的程式集上執行 ngen.exe,根據該屬性的標誌,該工具會自動生成**,就像已經指定了/debug/debugopt選項一樣。

如果 ngen.exe 在程式集中遇到它無法生成的任何方法,則它會將這些方法從本機映像中排除。當執行庫執行此程式集時,對於那些不包括在本機映像中的方法,它將迴轉到 jit 編譯。

當您使用 ngen.exe 來建立程式集的本機映像時,輸出取決於您指定的命令列選項以及計算機上的某些設定。這些設定包括:

ngen.exe 在生成本機映像時記錄這些資訊。當您執行程式集時,執行庫將查詢用匹配計算機的當前環境的選項和設定生成的本機映像。如果執行庫沒有找到匹配的本機映像,它將恢復為程式集的 jit 編譯。對計算機的設定和環境進行以下更改會導致本機映像失效:

如果在關閉了**訪問安全的程式集上執行 ngen.exe,則它生成的本機映像將在開啟**訪問安全時失效。注意,預設情況下,**訪問安全是開啟的。

有關公共語言執行庫如何管理**訪問安全以及如何使用許可權的詳細資訊,請參見**訪問安全性

注意在公共語言執行庫 1.0 版中,不自動建立或刪除失效的本機映像。您必須使用 ngen.exe 手動建立或刪除所有本機映像。

如果使用 ngen.exe 在安裝時生成應用程式的本機映像,必須指定應用程式的檔名,以及應用程式在編譯時引用的 .dll 檔案的完全指定程式集名稱。提**用程式引用的 dll 檔案的完全指定程式集名稱,可使 ngen.exe 能夠訪問所引用的程式集的發行者策略檔案。將來,如果更新 dll 檔案並使用發行者策略重定向版本,ngen.exe 將應用發行者策略。

有關此格式的更多資訊,請參見本主題後面的「示例」一節。

應用程式的解除安裝程序應該使用/delete[assemblyname | assemblypath] 選項來移除安裝應用程式時建立的本機映像。必須使用 assemblyname 或 assemblypath 引數指定要刪除的特定本機映像。指定/delete *將移除本機映像快取中的所有本機映像;指定/delete選項而不指定引數將產生錯誤。

示例在上例中,dll 檔案mylibone.dllmylibtwo.dll可以引用其他程式集。若要確定所引用的程式集的完全指定程式集名稱,請在mylibone.dllmylibtwo.dll上執行 ilda**.exe。在此示例中,假設mylibone.dll沒有引用任何其他程式集,mylibtwo.dll引用"mymath, version=1.0.0.0, culture=neutral, publickeytoken=0039def8abcbste7"。使用此資訊,下面的命令為應用程式的整個程式集引用目錄樹生成本機映像。

下面的命令生成具有指定路徑的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"

python 生成器作用 Python生成器

生成器介紹 在函式內部包含yield關鍵字,那麼該函式執行的結果是生成器,生成器就是迭代器。生成器的功能 把函式結果做成迭代器 以一種優雅的方式封裝好iter,next 提供了一種自己定義迭代器的方式。使用生成器建立乙個迭代器 def a print a yield 11 使用yield,執行後返回...

python生成器好處 Python生成器筆記

python中三大器有迭代器,生成器,裝飾器,本文主要講述生成器。主要從生成器的概念,本質,以及yield關鍵字的使用執行過程。本質 生成器是一類特殊的迭代器,使用了yield關鍵字的函式不再是函式,而是生成器。使用了yield的函式就是生成器 1.yield關鍵字有兩點作用 1.1 yield語句...

古文生成器python python(生成器)

生成器 先從列表生成式說起 可以通過簡單的式子,生成有規律的列表 如果把 換為 會發生什麼呢?看到 x 存的不再是列表,而是乙個位址,而這個位址就是我們的生成器物件的位址 這東西有什麼用呢?當然時,節省記憶體啦 假設現在有很龐大的一組資料要處理,貌似不可能把它一次性載入記憶體再進行處理,這時候就體現...