• CodeDOMProvider 类


    CodeDomProvider 可用来创建和检索代码生成器和代码编译器的实例。代码生成器可以生成特定语言的代码,如:C#、Visual Basic、JScript 等,而代码编译器可以将代码文件编译成程序集(*.dll)或可执行文件(*.exe)。有点类似用 JavaScript 函数创建 HTML 文档中的 DOM 树。

    示例

    在下面的示例程序 Program.cs 中,使用 CodeDOM 命名空间下的对象来生成和编译源程序,并利用 Console 类来输出 “Hello World” 字符串。程序中还提供了几种不同的编程语言:C#、Visual Basic 和 JScript。

    using System.CodeDom;
    using System.CodeDom.Compiler;
    using System.IO;
    
    namespace CodeDomApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                //c#
                CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
                //CodeDomProvider provider = CodeDomProvider.CreateProvider("VisualBasic");
                //CodeDomProvider provider = CodeDomProvider.CreateProvider("JScript");
    
                //生成对应的代码文件
                CodeDomExample.GenerateCode(provider, CodeDomExample.BuildHelloWorldGraph());
    
                //编译生成的代码文件
                CompilerResults  cr = CodeDomExample.CompileCode(provider, "TestGraph.cs", "TestGraph.exe");
                if (cr.Errors.Count <= 0)
                {
                    System.Console.WriteLine("把 TestGraph.cs 编译成 " + cr.PathToAssembly + " 时没有出现错误。");
                }
                //CodeDomExample.CompileCode(provider, "TestGraph.vb", "TestGraph.exe");
                //CodeDomExample.CompileCode(provider, "TestGraph.js", "TestGraph.exe");
            }
        }
    
        class CodeDomExample
        {
            /// <summary>
            /// 利用 System.CodeDom 对象生成一个 Hello World 程序的结构图
            /// </summary>
            /// <returns></returns>
            public static CodeCompileUnit BuildHelloWorldGraph()
            {
                // 新建一个 CodeCompileUnit 来包含程序图纸
                CodeCompileUnit compileUnit = new CodeCompileUnit();
    
                // 声明一个名称为 Samples 的新命名空间
                CodeNamespace samples = new CodeNamespace("Samples");
                // 把新命名空间添加到程序编译单元中
                compileUnit.Namespaces.Add(samples);
    
                // 添加新的命名空间(System 命名空间)的引用
                samples.Imports.Add(new CodeNamespaceImport("System"));
    
                // 定义一个新类,取名为 Class1
                CodeTypeDeclaration class1 = new CodeTypeDeclaration("Class1");
                // 把 Class1 添加到 Samples 命名空间中
                samples.Types.Add(class1);
    
                // 定义新的代码入口点(Main 方法)
                CodeEntryPointMethod start = new CodeEntryPointMethod();
    
                // 为 System.Console 类创建一个类型引用
                CodeTypeReferenceExpression csSystemConsoleType = new CodeTypeReferenceExpression("System.Console");
    
                // 构建一个 Console.WriteLine 方法的声明
                CodeMethodInvokeExpression cs1 = new CodeMethodInvokeExpression(
                    csSystemConsoleType,
                    "WriteLine",
                    new CodePrimitiveExpression("Hello World!"));
    
                // 把 WriteLine 方法添加到 Main 方法中
                start.Statements.Add(cs1);
    
                // 构建另一个 Console.WriteLine 方法的声明
                CodeMethodInvokeExpression cs2 = new CodeMethodInvokeExpression(
                    csSystemConsoleType,
                    "WriteLine",
                    new CodePrimitiveExpression("Press the Enter key to continue."));
    
                // 把 WriteLine 方法添加到 Main 方法中
                start.Statements.Add(cs2);
    
                // 构建 Console.ReadLine 方法的声明
                CodeMethodInvokeExpression csReadLine = new CodeMethodInvokeExpression(
                    csSystemConsoleType,
                    "ReadLine");
    
                // 把 ReadLine 方法添加到 Main 方法中
                start.Statements.Add(csReadLine);
    
                // 把 Main 方法添加 Class1 类中
                class1.Members.Add(start);
    
                return compileUnit;
            }
    
            /// <summary>
            /// 生成代码文件
            /// </summary>
            /// <param name="provider">CodeDomProvider对象</param>
            /// <param name="compileunit">CodeCompileUnit对象</param>
            public static void GenerateCode(CodeDomProvider provider, CodeCompileUnit compileunit)
            {
                // 把源文件编译成相应格式的程序文件
                string sourceFile;
                if (provider.FileExtension[0] == '.')
                {
                    sourceFile = "TestGraph" + provider.FileExtension;
                }
                else
                {
                    sourceFile = "TestGraph." + provider.FileExtension;
                }
    
                // 新建一个 IndentedTextWriter 对象,
                // 其构造函数包含一个读取源文件的 StreamWriter 对象
                IndentedTextWriter tw = new IndentedTextWriter(new StreamWriter(sourceFile, false), "");
                // 利用生成器生成源代码
                provider.GenerateCodeFromCompileUnit(compileunit, tw, new CodeGeneratorOptions());
                // 关闭文件输出流
                tw.Close();
            }
    
            /// <summary>
            /// 把代码文件编译可执行文件(*.exe)
            /// </summary>
            /// <param name="provider">CodeDomProvider对象</param>
            /// <param name="sourceFile">源文件名称</param>
            /// <param name="exeFile">生成的可执行文件的名称</param>
            /// <returns></returns>
            public static CompilerResults CompileCode(CodeDomProvider provider, string sourceFile, string exeFile)
            {
                // 配置一个 CompilerParameters 对象,它依赖 System.dll
                // 并生成指定的可执行的文件
                string[] referenceAssemblies = { "System.dll" };
                CompilerParameters cp = new CompilerParameters(referenceAssemblies, exeFile, false);
                // 生成一个可执行文件,而不是一个 DLL 文件
                cp.GenerateExecutable = true;
    
                // 调用编译器
                CompilerResults cr = provider.CompileAssemblyFromFile(cp, sourceFile);
                
                // 返回编译结果
                return cr;
            }
        }
    }

    生成的文件如下:

    运行 TestGraph.exe 时,输出结果如下:

    参考资源:

    https://msdn.microsoft.com/zh-cn/library/f1dfsbhc(v=vs.110).aspx

    https://msdn.microsoft.com/zh-cn/library/system.codedom.compiler.codedomprovider(v=vs.110).aspx 

  • 相关阅读:
    剑指offer-二维数组中的查找
    TF-IDF(term frequency–inverse document frequency)
    Java实现中文字符串的排序功能
    当前课程
    【R】资源整理
    CentOS相关
    【转】Setting up SDL Extension Libraries on MinGW
    【转】Setting up SDL Extension Libraries on Visual Studio 2010 Ultimate
    【转】Setting up SDL Extension Libraries on Code::Blocks 12.11
    【转】Setting up SDL Extension Libraries on Visual Studio 2019 Community
  • 原文地址:https://www.cnblogs.com/hellowzl/p/6395062.html
Copyright © 2020-2023  润新知