zoukankan      html  css  js  c++  java
  • 使用CodeDom生成程序集

     
    using System;
    using Microsoft.CSharp;
    using System.CodeDom.Compiler;
    using System.CodeDom;

    namespace Test.CUI
    {
      class Program
      {
        static void Main()
        {
          // 创建编译器对象
          CSharpCodeProvider p = new CSharpCodeProvider();
          ICodeCompiler cc = p.CreateCompiler();

          // 设置编译参数
          CompilerParameters options = new CompilerParameters();
          options.ReferencedAssemblies.Add("System.dll");
          options.GenerateExecutable = true;
          options.OutputAssembly = "HelloWorld.exe";

          //options.ReferencedAssemblies.Add("System.Windows.Forms.dll");
          //options.EmbeddedResources.Add("Data.xml"); // 添加内置资源
          //options.CompilerOptions += " /target:winexe";
          //options.CompilerOptions += " /res:Resource1.res";
          //options.CompilerOptions += " /win32icon:test.ico";
          
          // 创建源码

          // 1. 使用CodeDom创建源码
          //CodeCompileUnit cu = new CodeCompileUnit();
          //CodeNamespace Samples = new CodeNamespace("Samples");
          //cu.Namespaces.Add(Samples);
          //Samples.Imports.Add(new CodeNamespaceImport("System"));
          //CodeTypeDeclaration Class1 = new CodeTypeDeclaration("Class1");
          //Samples.Types.Add(Class1);
          //CodeEntryPointMethod Start = new CodeEntryPointMethod();
          //CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
          //  new CodeTypeReferenceExpression("System.Console"), "WriteLine",
          //  new CodePrimitiveExpression("Hello World!") );
          //Start.Statements.Add(new CodeExpressionStatement(cs1));
          //Class1.Members.Add(Start);

          // 2. 直接指定源码字符串
          string code = @"
            using System;
            namespace Samples
            {
              public class Class1
              {
                static void Main(string[] args)
                {
                  Console.WriteLine(""Hello, World!"");
                  Console.WriteLine(DateTime.Now.ToString());
                }
              }
            }
          ";
          CodeSnippetCompileUnit cu = new CodeSnippetCompileUnit(code);

          // 开始编译
          CompilerResults cr = cc.CompileAssemblyFromDom(options, cu);

          // 显示编译信息
          if (cr.Errors.Count == 0)
            Console.WriteLine("\"{0}\" compiled ok!", cr.CompiledAssembly.Location);
          else
          {
            Console.WriteLine("Complie Error:");
            foreach (CompilerError error in cr.Errors)
              Console.WriteLine(" {0}", error);
          }

          Console.WriteLine("Press Enter key to exit...");
          Console.ReadLine();
        }
      }
    }

    ICodeCompiler 除了 CompileAssemblyFromDom 方法外,还有:

    CompileAssemblyFromDom
    使用指定的编译器设置从指定的 CodeCompileUnit 所包含的 System.CodeDom 树中编译程序集。

    CompileAssemblyFromDomBatch
    基于包含在 CodeCompileUnit 对象的指定数组中的 System.CodeDom 树,使用指定的编译器设置编译程序集。

    CompileAssemblyFromFile
    从包含在指定文件中的源代码,使用指定的编译器设置编译程序集。

    CompileAssemblyFromFileBatch
    从包含在指定文件中的源代码,使用指定的编译器设置编译程序集。

    CompileAssemblyFromSource
    从包含源代码的指定字符串,使用指定的编译器设置编译程序集。

    CompileAssemblyFromSourceBatch
    从包含源代码的字符串的指定数组,使用指定的编译器设置编译程序集。

    如此我们可以非常方便编译一个复杂的程序集。
  • 相关阅读:
    SQL语句(十二)分组查询
    SQL语句(十一)函数查询
    Markdown公式
    处理机调度(一)——处理机调度概念
    进程控制(一)——进程创建
    线程(二)—— 用户线程和内核线程
    进程(三)—— 进程的状态
    进程(二)—— 进程控制块
    进程(一)—— 进程概念
    Java迭代器用法
  • 原文地址:https://www.cnblogs.com/zuiyirenjian/p/1683540.html
Copyright © 2011-2022 走看看