zoukankan      html  css  js  c++  java
  • C#动态编译

    公司需要自己做一个打包程序,将需要升级文件和脚本做成一个exe安装包,双击exe安装包的时候输入相关的参数就执行升级(文件覆盖和脚本执行),大概思路如下:
    1.先把exe的逻辑写好,包括提取文件和脚本执行代码
    2.exe从资源中提取文件和脚本
    3.组包程序将需要升级的脚本和文件加入到exe的资源文件,然后编译成exe。

    exe的核心代码如下:

    if (!Directory.Exists("myFile"))
    {
        Directory.CreateDirectory("myFile");
    }
    
    //获取资源文件并输出到myFile文件夹
    Assembly assm = Assembly.GetExecutingAssembly();
    foreach (var item in assm.GetManifestResourceNames())
    {
        Stream stream = assm.GetManifestResourceStream(item);
        byte[] bs = new byte[stream.Length];
        stream.Read(bs, 0, bs.Length);
        File.WriteAllBytes("myFile\" + item, bs);
        this.textBox1.AppendText("成功提取文件:" + item + "
    ");
    }
    this.textBox1.AppendText("文件保存在:"+AppDomain.CurrentDomain.BaseDirectory+"\myFile");
    string result = string.Join("*", assm.GetManifestResourceNames());
    MessageBox.Show("成功," + result);


    组包的核心代码如下:

    CSharpCodeProvider p = new CSharpCodeProvider();
    
    // 设置编译参数
    CompilerParameters options = new CompilerParameters();
    
    //加入引用的程序集
    options.ReferencedAssemblies.Add("System.dll");
    options.ReferencedAssemblies.Add("System.Windows.Forms.dll");
    options.ReferencedAssemblies.Add("System.Drawing.dll");
    
    options.GenerateExecutable = true;                  //是否生成可执行文件,否则就是内存中
    // CompilerOptions 参考地址:https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/compiler-options/addmodule-compiler-option
    options.CompilerOptions = "-t:winexe";              //非控制台应用程序
    options.CompilerOptions += " -win32icon:index.ico"; //设置图标
    options.OutputAssembly = "HelloWorld.exe";          //输出exe的名称
    options.MainClass = "TestPackage.Program";          //主运行类
    
    //循环加入资源文件,貌似不支持文件夹,因此多个文件可以自己压缩为zip再加入
    foreach (var file in this.listBox1.Items)
    {
        options.EmbeddedResources.Add(file.ToString());
    }
    
    // 开始编译
    string[] files = new string[]{
        @"......TestPackageProgram.cs",
        @"......TestPackageMainForm.cs"
    };
    CompilerResults cr = p.CompileAssemblyFromFile(options, files);
    
    // 显示编译信息
    if (cr.Errors.Count == 0)
    {
        Console.WriteLine("{0} compiled ok!", cr.CompiledAssembly.Location);
        MessageBox.Show("成功");
    }
    else
    {
        Console.WriteLine("Complie Error:");
        foreach (CompilerError error in cr.Errors)
            Console.WriteLine("  {0}", error);
        MessageBox.Show("失败");
    }
    
    Console.WriteLine("Press Enter key to exit...");

    有了核心代码,后面的就可以自己去实现文件的加入和提取了。

  • 相关阅读:
    【PS技巧】常用概念和功能操作
    【存储】RAID磁盘阵列选择
    【Python 01】Python一种面向对象、解释型计算机程序设计语言
    【PS技巧】如何校正倾斜的图片
    【阿里巴巴大数据实践笔记】第14章:存储和成本管理
    【阿里巴巴大数据实践笔记】第13章:计算管理
    【阿里巴巴大数据实践笔记】第9章:阿里巴巴数据整合及管理体系
    今晚直播丨抢鲜体验-openGauss入门
    详述一则数据库死锁故障的分析过程
    前端学习笔记(一)HTML入门
  • 原文地址:https://www.cnblogs.com/duanjt/p/10875163.html
Copyright © 2011-2022 走看看