深入本機(jī)影像生成器(Ngen.exe)工具使用方法詳解
.Net framework安裝目錄下(類似C:\Windows\Microsoft.NET\Framework\v4.0.30319)有一個(gè)ngen.exe工具,就是做這件事兒的。這個(gè)程序是一個(gè)控制臺(tái)程序,最常用的使用方法如下:
生成文件filepath的native code使用下面命令:
ngen install filepath
卸載文件filepath的native code使用下面命令
Ngen uninstall filepath
本文主要就用這兩種用法,有關(guān)這個(gè)工具更多的參數(shù)和介紹,請(qǐng)參考msdn。
客戶端程序我們必然要制作安裝包,我的思路是在安裝程序時(shí)就做本機(jī)映象的生成操作;我們可以在安裝程序中添加一步自定義操作來做這件事情。
如果你對(duì)本文的話題感興趣,不妨按照下面步驟試一下。
1. 新建解決方案,名字隨意
2. 在新解決方案中添加一個(gè)winform項(xiàng)目,假定我們要對(duì)這個(gè)winform項(xiàng)目生成的可執(zhí)行文件做本機(jī)映象生成操作;這只是一個(gè)演示,所以這個(gè)項(xiàng)目什么都不做
3. 在這個(gè)解決方案中添加一個(gè)名字為NgenInstaller的類庫項(xiàng)目,并新建一個(gè)Installer Class;
4. 代碼實(shí)現(xiàn)很簡(jiǎn)單就是使用Process執(zhí)行ngen程序來完成安裝。需要注意的時(shí),具體讓ngen安裝那些文件時(shí)通過Context.Parameters[“ngen1|2|3”]傳進(jìn)來的,這個(gè)參數(shù)需要在制作安裝包的自定義步驟中設(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;
//需要生成本機(jī)映象的程序集名字,配置在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);
}
}
}
這個(gè)類庫中只有這一個(gè)類,完成我們要的操作
5. 最后一步是制作安裝程序,在解決方案中添加安裝項(xiàng)目
添加安裝程序之后右擊安裝項(xiàng)目添加項(xiàng)目輸出,如下圖所示
在添加項(xiàng)目輸出的對(duì)話框中選擇Winforms項(xiàng)目和剛建的類庫。
然后右擊安裝項(xiàng)目選擇視圖---自定操作打開自定義操作窗口,添加一個(gè)名字為“Ngen生成本機(jī)映象”的自定義操作,在添加操作時(shí)要選擇NgenInstaller項(xiàng)目輸出 如下圖:
然后將自定義操作的名字修改為“Ngen生成本機(jī)代碼”,如下圖所示
然后右擊新建的自定義操作,選擇屬性窗口,在屬性窗口的CustomActionData屬性中添加需要操作的程序集,注意CustomActionData是一個(gè)鍵值對(duì),每個(gè)鍵值對(duì)以/開始
完成這一步就差不多了,你可以編譯一下整個(gè)解決方案。運(yùn)行安裝項(xiàng)目生成的安裝包。
6. 運(yùn)行安裝包,如果一切正常的話就做了本機(jī)映象生成了,可以通過ngen display filePath命令來驗(yàn)證native本機(jī)影響是否安裝正常,如下命令行輸出
相關(guān)文章
"PageMethods未定義"或"對(duì)象不支持此屬性或方法"解決方法分享
PageMethods未定義或?qū)ο蟛恢С执藢傩曰蚍椒ń鉀Q方法,需要的朋友可以參考下。2010-12-12VB.NET調(diào)用MySQL存儲(chǔ)過程并獲得返回值的方法
這篇文章主要介紹了VB.NET調(diào)用MySQL存儲(chǔ)過程并獲得返回值的方法,涉及基于VB.NET操作MySQL數(shù)據(jù)庫的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07asp.net(c#)實(shí)現(xiàn)從sqlserver存取二進(jìn)制圖片的代碼
有一個(gè)員工表Employee,需要保存員工照片(Photo)到數(shù)據(jù)庫(sql server)上。員工照片對(duì)應(yīng)的字段是varbinary(max),也就是要存成二進(jìn)制文件類型(這和以前討巧地存圖片文件路徑就不相同了),默認(rèn)可以為空。2011-09-09Visual Studio 2017正式版發(fā)布 Mac版新功能特性有哪些
Visual Studio 2017正式版推出時(shí)間什么時(shí)候?Mac版新功能特性又有哪些?這篇文章就為大家詳細(xì)介紹Visual Studio 2017正式版的最新消息,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-03-03asp.net 簡(jiǎn)單工廠模式和工廠方法模式之論述
簡(jiǎn)單工廠模式的最大優(yōu)點(diǎn)在于工廠類中包含了必要的邏輯判斷,根據(jù)客戶端的選擇條件動(dòng)態(tài)實(shí)例化相關(guān)的類,對(duì)于客戶端來說,去除了于具體產(chǎn)品的依賴2011-12-12ASP.NET中實(shí)現(xiàn)把Json數(shù)據(jù)轉(zhuǎn)換為ADO.NET DataSet對(duì)象
這篇文章主要介紹了ASP.NET中實(shí)現(xiàn)把Json數(shù)據(jù)轉(zhuǎn)換為ADO.NET DataSet對(duì)象,本文講解設(shè)計(jì)及實(shí)現(xiàn)方法,相關(guān)代碼托管到GITHUB,需要的朋友可以參考下2015-03-03