深入本机影像生成器(Ngen.exe)工具使用方法详解

先介绍一点背景知识;.Net程序在运行时会实时(JIT)编译,将.Net程序文件编译成cpu认识的汇编机器码。实时编译需要消耗额外的cpu和内存资源,这对于服务器端程序是无关紧要的,因为实时编译只在程序第一次运行时编译,之后就不需要再做了;如果你在做的是一个较大的winform程序或者silverlight等客户端程序时就需要考虑提前编译了。
.Net framework安装目录下(类似C:\Windows\Microsoft.NET\Framework\v4.0.30319)有一个ngen.exe工具,就是做这件事儿的。这个程序是一个控制台程序,最常用的使用方法如下:
生成文件filepath的native code使用下面命令:


代码如下:

ngen install filepath

卸载文件filepath的native code使用下面命令


代码如下:

Ngen uninstall filepath

本文主要就用这两种用法,有关这个工具更多的参数和介绍,请参考msdn
客户端程序我们必然要制作安装包,我的思路是在安装程序时就做本机映象的生成操作;我们可以在安装程序中添加一步自定义操作来做这件事情。
如果你对本文的话题感兴趣,不妨按照下面步骤试一下。
1. 新建解决方案,名字随意
2. 在新解决方案中添加一个winform项目,假定我们要对这个winform项目生成的可执行文件做本机映象生成操作;这只是一个演示,所以这个项目什么都不做
3. 在这个解决方案中添加一个名字为NgenInstaller的类库项目,并新建一个Installer Class;

在新建的NgenInstaller类中添加在安装时使用ngen安装程序的功能代码。
4. 代码实现很简单就是使用Process执行ngen程序来完成安装。需要注意的时,具体让ngen安装那些文件时通过Context.Parameters[“ngen1|2|3”]传进来的,这个参数需要在制作安装包的自定义步骤中设置。
实现代码:


代码如下:

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本机影响是否安装正常,如下命令行输出

附件中是测试项目源码。希望这篇文章有用。

(0)

相关推荐

  • 深入本机影像生成器(Ngen.exe)工具使用方法详解

    先介绍一点背景知识:.Net程序在运行时会实时(JIT)编译,将.Net程序文件编译成cpu认识的汇编机器码.实时编译需要消耗额外的cpu和内存资源,这对于服务器端程序是无关紧要的,因为实时编译只在程序第一次运行时编译,之后就不需要再做了:如果你在做的是一个较大的winform程序或者silverlight等客户端程序时就需要考虑提前编译了..Net framework安装目录下(类似C:\Windows\Microsoft.NET\Framework\v4.0.30319)有一个ngen.ex

  • K8S部署Kafka界面管理工具(kafkamanager)方法详解

    kafka-manager 是雅虎开源的apache-kafka管理工具,是用Scala编写的,可以在web页面进行kafka的相关操作. 一.制作kafkamanager的image镜像 下载kafka-manager-2.0.0.2.zip,在解压目录的conf下的application.conf文件里,修改kafka-manager.zkhosts地址和cmake.zkhosts地址为: zok-0.zk-hs.wiseco.svc.cluster.local:2181,zok-1.zk-

  • 使用yum查看工具lspci所在包并安装的方法(详解)

    摘要:虚拟机安装时一般都采用最小化安装,默认没有lspci工具.一台测试虚拟网卡性能的虚拟机,需要lspci工具来查看网卡的类型.本文描述了在一个虚拟机中安装lspci工具的具体步骤. 由于要测试虚拟机上的不同的虚拟网卡驱动类型的传输效率,所以需要变化虚拟机的虚拟网卡类型,并且利用lspci工具验证是否加载成功. 虚拟机操作系统:CentOS6.0 i386. 启动虚拟机后,键入lspci,系统提示没有这个命令.于是想到先安装这个工具再测试.安装过程需要解决几个问题:安装源?lspci属于哪个包

  • java 使用idea将工程打成jar并创建成exe文件类型执行的方法详解

    第一部分: 使用idea 打包工程jar 1.准备好一份 开发好的 可执行的 含有main方法的 工程. 例如:我随便写的main方法 public static void main(String[] args) throws IOException { Properties properties = System.getProperties(); String osName = properties.getProperty("os.name"); System.out.println

  • python2利用wxpython生成投影界面工具的图文详解

    本投影界面工具的功能: 准备好.prj投影文件,将输入文件夹内的WGS84经纬度坐标shp文件,投影为平面文件,成果自动命名为prj_***并新建在输入文件夹同一路径下. 下一步目标: 利用pyinstaller或其他打包库生成exe文件,目前停滞在python2语法.arcpy打包出错相关问题上. 参考文献: <Using Py2exe with Arcpy- It can be done easily!> <如何使用py2exe打包arcpy脚本?> GUI界面示意图 投影文件

  • Java制作证书的工具keytool用法详解

    目录 一.keytool的概念 二.keytool的用法 三.创建证书 四.查看密钥库里面的证书 五.导出到证书文件 六.导入证书 七.查看证书信息 八.删除密钥库中的条目 九.修改证书条目的口令 一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在JDK 1.4以后的版本中都包含了这一工具,它的位置为%JAVA_HOME%\bin\keytool.

  • YUM解决RPM包安装依赖关系及yum工具介绍本地源配置方法详解

    1.背景概述 在实际生产环境下,对于在linux系统上安装rpm包,主要面临两个实际的问题 1)安装rpm包过程中,不断涌现的依赖关系问题,导致需要按照提示或者查询资料,手工安装更多的包 2)由于内外网的隔离,无法连接外网的yum源 鉴于上述因此,本文将详细介绍,yum工具以及配置本地yum源的方法 2.yum工具简介 •yum工具作为rpm包的软件管理器,可以进行rpm包的安装.升级以及删除等日常管理工作,而且对于rpm包之间的依赖关系可以自动分析,大大简化了rpm包的维护成本. •yum工具

  • apache commons工具集代码详解

    Apache Commons包含了很多开源的工具,用于解决平时编程经常会遇到的问题,减少重复劳动.下面是我这几年做开发过程中自己用过的工具类做简单介绍. 组件 功能介绍 BeanUtils 提供了对于JavaBean进行各种操作,克隆对象,属性等等. Betwixt XML与Java对象之间相互转换. Codec 处理常用的编码方法的工具类包 例如DES.SHA1.MD5.Base64等. Collections java集合框架操作. Compress java提供文件打包 压缩类库. Con

  • PHP性能测试工具xhprof安装与使用方法详解

    本文实例分析了PHP性能测试工具xhprof安装与使用方法.分享给大家供大家参考,具体如下: xhprof概述: XHProf是一个分层PHP性能分析工具.它报告函数级别的请求次数和各种指标,包括阻塞时间,CPU时间和内存使用情况.一个函数的开销,可细分成调用者和被调用者的开销,XHProf数据收集阶段,它记录调用次数的追踪和包容性的指标弧在动态callgraph的一个程序.它独有的数据计算的报告/后处理阶段.在数据收集时,XHProfd通过检测循环来处理递归的函数调用,并通过给递归调用中每个深

  • Vue安装浏览器开发工具的步骤详解

    开发vue时,浏览器有一个好的开发调试工具能让开发事半功倍,磨刀不误砍柴工. 步骤 1.下载工具 地址:  https://github.com/vuejs/vue-devtools 2.安装依赖 cmd进入vue-devtools文件夹,安装相关依赖,依次执行npm install,再执行npm run build. 3.修改配置 打开shells>chrome>src>manifest.json,修改"persistent":false为true. 4.浏览器安装

随机推荐