使用CodeDom生成程序集

本文档展示了如何使用CSharpCodeProvider和ICodeCompiler接口动态生成并编译C#源代码,创建一个名为HelloWorld.exe的可执行程序。通过设置编译参数并直接指定源码字符串,实现编译过程的控制。此外,还列举了ICodeCompiler提供的其他编译方法。

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 
从包含源代码的字符串的指定数组,使用指定的编译器设置编译程序集。 

如此我们可以非常方便编译一个复杂的程序集。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值