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

 更新时间:2013年05月18日 15:19:44   作者:  
本篇文章是对本机影像生成器(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本机影响是否安装正常,如下命令行输出

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

相关文章

  • subsonic3.0插件更新字符串过长引发的异常修复方法

    subsonic3.0插件更新字符串过长引发的异常修复方法

    这篇文章主要介绍了subsonic3.0插件更新字符串过长引发的异常修复方法,需要的朋友可以参考下
    2014-04-04
  • asp.net使用ashx生成图形验证码的方法示例

    asp.net使用ashx生成图形验证码的方法示例

    这篇文章主要介绍了asp.net使用ashx生成图形验证码的方法,结合实例形式分析了asp.net生成图形验证码的步骤、实现方法与相关注意事项,需要的朋友可以参考下
    2017-07-07
  • 去除HTML标签删除HTML示例代码

    去除HTML标签删除HTML示例代码

    这篇文章主要介绍了如何去除HTML标签、删除HTML。示例中使用到了一个正则,直接使用就可以了
    2014-06-06
  • .NET 6实现基于JWT的Identity功能方法详解

    .NET 6实现基于JWT的Identity功能方法详解

    在.NET Web API开发中还有一个很重要的需求是关于身份认证和授权的。本文将介绍使用.NET框架自带的认证和授权中间件去实现基于JWT的身份认证和授权功能的方法详解,需要的可以参考一下
    2022-01-01
  • asp.net(C#)生成Code39条形码实例 条码枪可以扫描出

    asp.net(C#)生成Code39条形码实例 条码枪可以扫描出

    这篇文章主要介绍了asp.net(C#)生成Code39条形码实例 条码枪可以扫描出。需要的朋友可以过来参考下,希望对大家有所帮助
    2014-02-02
  • asp.net下使用DIME协议上传文件

    asp.net下使用DIME协议上传文件

    asp.net下使用DIME协议上传文件...
    2007-04-04
  • 在.Net中使用MongoDB的方法教程

    在.Net中使用MongoDB的方法教程

    最近在研究mongodb,在网上搜索发现针对.net 中使用mongodb的文章要么是早期的驱动版本,要么资料很少,所以写个随笔记录一下,本文详细的给大家介绍了在.Net中使用MongoDB的方法教程,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-05-05
  • MVC分页之MvcPager使用详解

    MVC分页之MvcPager使用详解

    这篇文章主要为大家详细介绍了MVC分页之MvcPager使用方法,针对MvcPager同步和Ajax异步分页进行讲解,感兴趣的小伙伴们可以参考一下
    2016-07-07
  • ASP.NET MVC5网站开发文章管理架构(七)

    ASP.NET MVC5网站开发文章管理架构(七)

    继上一篇把member的用户部分完成,现在开始做文章管理部分。文章部分根据涉及显示现实文章列表,发布文章,修改和删除文章等功能。最终的实现目标是使用权限来控制用户是否能进行相应操作,管理员权限的会显示全部文章列表和我的文章列表,普通用户只显示我的文章列表
    2015-09-09
  • ASP.NET Core Web API中实现监控的方法

    ASP.NET Core Web API中实现监控的方法

    本文介绍了在ASP.NETCoreWebAPI中实现监控的几种流行开源工具,可以监控API的性能、请求、响应时间、错误率等,具有一定的参考价值,感兴趣的可以了解一下
    2025-01-01

最新评论