c#程序打包、机器代码生成(Ngen.exe)

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

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

  复制代码 代码以下:php

  ngen install filepath 服务器


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

  复制代码 代码以下:app

  Ngen uninstall filepath ide


本文主要就用这两种用法,有关这个工具更多的参数和介绍,请参考 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. 最后一步是制做安装程序,在解决方案中添加安装项目

  

  添加安装程序以后右击安装项目添加项目输出,以下图所示spa

  

  在添加项目输出的对话框中选择Winforms项目和刚建的类库。
而后右击安装项目选择视图---自定操做打开自定义操做窗口,添加一个名字为“Ngen生成本机映象”的自定义操做,在添加操做时要选择NgenInstaller项目输出 以下图:命令行

  

  而后将自定义操做的名字修改成“Ngen生成本机代码”,以下图所示code

  

  而后右击新建的自定义操做,选择属性窗口,在属性窗口的CustomActionData属性中添加须要操做的程序集,注意CustomActionData是一个键值对,每一个键值对以/开始orm

  

  完成这一步就差很少了,你能够编译一下整个解决方案。运行安装项目生成的安装包。
6. 运行安装包,若是一切正常的话就作了本机映象生成了,能够经过ngen display filePath命令来验证native本机影响是否安装正常,以下命令行输出

  

附件中是测试项目源码。但愿这篇文章有用。
标签:  工具  Ngen.exe
相关文章
相关标签/搜索