深入本機影像生成器(Ngen.exe)工具使用方法詳解
.Net framework安裝目錄下(類似C:\Windows\Microsoft.NET\Framework\v4.0.30319)有一個ngen.exe工具,就是做這件事兒的。這個程序是一個控制臺程序,最常用的使用方法如下:
生成文件filepath的native code使用下面命令:
ngen install filepath
卸載文件filepath的native code使用下面命令
Ngen uninstall filepath
本文主要就用這兩種用法,有關(guān)這個工具更多的參數(shù)和介紹,請參考msdn。
客戶端程序我們必然要制作安裝包,我的思路是在安裝程序時就做本機映象的生成操作;我們可以在安裝程序中添加一步自定義操作來做這件事情。
如果你對本文的話題感興趣,不妨按照下面步驟試一下。
1. 新建解決方案,名字隨意
2. 在新解決方案中添加一個winform項目,假定我們要對這個winform項目生成的可執(zhí)行文件做本機映象生成操作;這只是一個演示,所以這個項目什么都不做
3. 在這個解決方案中添加一個名字為NgenInstaller的類庫項目,并新建一個Installer Class;

4. 代碼實現(xiàn)很簡單就是使用Process執(zhí)行ngen程序來完成安裝。需要注意的時,具體讓ngen安裝那些文件時通過Context.Parameters[“ngen1|2|3”]傳進來的,這個參數(shù)需要在制作安裝包的自定義步驟中設(shè)置。
實現(xiàn)代碼:
using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Configuration.Install;
using System.Linq;
using System.Runtime.InteropServices;
using System.IO;
using System.Diagnostics;
namespace NgenInstaller
{
[RunInstaller(true)]
public partial class NgenInstaller : System.Configuration.Install.Installer
{
public NgenInstaller()
{
InitializeComponent();
}
public override void Install(IDictionary stateSaver)
{
NgenFile(InstallTypes.Install);
}
public override void Uninstall(IDictionary savedState)
{
NgenFile(InstallTypes.Uninstall);
}
private enum InstallTypes
{
Install,
Uninstall
}
private void NgenFile(InstallTypes options)
{
string envDir = RuntimeEnvironment.GetRuntimeDirectory();
string ngenPath = Path.Combine(envDir, "ngen.exe");
string exePath = Context.Parameters["assemblypath"];
string appDir = Path.GetDirectoryName(exePath);
int i = 1;
do {
string fileKey = "ngen" + i;
//需要生成本機映象的程序集名字,配置在ngen1...5,6的配置中
if (Context.Parameters.ContainsKey(fileKey))
{
string ngenFileName = Context.Parameters["ngen" + i];
string fileFullName = Path.Combine(appDir, ngenFileName);
string argument = (options == InstallTypes.Install ? "install" : "uninstall") + " \"" + fileFullName + "\"";
Process ngenProcess = new Process();
ngenProcess.StartInfo.FileName = ngenPath;
ngenProcess.StartInfo.Arguments = argument;
ngenProcess.StartInfo.CreateNoWindow = true;
ngenProcess.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
ngenProcess.Start();
ngenProcess.WaitForExit();
i++;
}
else {
break;
}
}
while (true);
}
}
}
這個類庫中只有這一個類,完成我們要的操作
5. 最后一步是制作安裝程序,在解決方案中添加安裝項目

添加安裝程序之后右擊安裝項目添加項目輸出,如下圖所示

在添加項目輸出的對話框中選擇Winforms項目和剛建的類庫。
然后右擊安裝項目選擇視圖---自定操作打開自定義操作窗口,添加一個名字為“Ngen生成本機映象”的自定義操作,在添加操作時要選擇NgenInstaller項目輸出 如下圖:

然后將自定義操作的名字修改為“Ngen生成本機代碼”,如下圖所示

然后右擊新建的自定義操作,選擇屬性窗口,在屬性窗口的CustomActionData屬性中添加需要操作的程序集,注意CustomActionData是一個鍵值對,每個鍵值對以/開始

完成這一步就差不多了,你可以編譯一下整個解決方案。運行安裝項目生成的安裝包。
6. 運行安裝包,如果一切正常的話就做了本機映象生成了,可以通過ngen display filePath命令來驗證native本機影響是否安裝正常,如下命令行輸出

相關(guān)文章
subsonic3.0插件更新字符串過長引發(fā)的異常修復(fù)方法
這篇文章主要介紹了subsonic3.0插件更新字符串過長引發(fā)的異常修復(fù)方法,需要的朋友可以參考下2014-04-04
.NET 6實現(xiàn)基于JWT的Identity功能方法詳解
在.NET Web API開發(fā)中還有一個很重要的需求是關(guān)于身份認證和授權(quán)的。本文將介紹使用.NET框架自帶的認證和授權(quán)中間件去實現(xiàn)基于JWT的身份認證和授權(quán)功能的方法詳解,需要的可以參考一下2022-01-01
asp.net(C#)生成Code39條形碼實例 條碼槍可以掃描出
這篇文章主要介紹了asp.net(C#)生成Code39條形碼實例 條碼槍可以掃描出。需要的朋友可以過來參考下,希望對大家有所幫助2014-02-02
ASP.NET MVC5網(wǎng)站開發(fā)文章管理架構(gòu)(七)
繼上一篇把member的用戶部分完成,現(xiàn)在開始做文章管理部分。文章部分根據(jù)涉及顯示現(xiàn)實文章列表,發(fā)布文章,修改和刪除文章等功能。最終的實現(xiàn)目標是使用權(quán)限來控制用戶是否能進行相應(yīng)操作,管理員權(quán)限的會顯示全部文章列表和我的文章列表,普通用戶只顯示我的文章列表2015-09-09
ASP.NET?Core?Web?API中實現(xiàn)監(jiān)控的方法
本文介紹了在ASP.NETCoreWebAPI中實現(xiàn)監(jiān)控的幾種流行開源工具,可以監(jiān)控API的性能、請求、響應(yīng)時間、錯誤率等,具有一定的參考價值,感興趣的可以了解一下2025-01-01

