• 简单了解.NET中的动态编译机制


    说来惭愧,周末跟一个同事讨论.NET中的动态编译,觉得实现起来可能有困难。一直不知道.NET Framework提供了一个代码文档对象模型(CodeDOM),可以动态的生成代码并动态编译,只是自己孤陋寡闻,没有用过罢了。这里简单的写一下实现步骤,有时间我会详细地写一下这方面的东西。

    第一步:添加引用

    using System.Reflection;

    using Microsoft.CSharp;

    using System.CodeDom.Compiler;

    第二步:创建需要编译的代码

    string MyCodeString=@"

    public class MyTest

    {

        public static string GetTestString()

        {

            string MyStr = ""This is a Dynamic Compiler Demo!"";

            return MyStr;

        }

    }";

    第三步:实现动态编译

    CompilerParameters compilerParams = new CompilerParameters();

           

     ///编译器选项设置

    compilerParams.CompilerOptions = "/target:library /optimize";

     

    ///编译时在内存输出

    compilerParams.GenerateInMemory = true;

     

    ///生成调试信息

    compilerParams.IncludeDebugInformation = false;

           

     ///添加相关的引用

    compilerParams.ReferencedAssemblies.Add("mscorlib.dll");

    compilerParams.ReferencedAssemblies.Add("System.dll");

     

    ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler();

     

    ///编译

    CompilerResults results = compiler.CompileAssemblyFromSource(compilerParams,MyCodeString);

    第四步:输出编译结果

    ///创建程序集

    Assembly asm = results.CompiledAssembly;

           

    ///获取编译后的类型

    object objMyTestClass = asm.CreateInstance("MyTest");

    Type MyTestClassType=objMyTestClass.GetType();

     

    ///输出结果

    Console.WriteLine(MyTestClassType.GetMethod("GetTestString").Invoke(objMyTestClass,null));

    Console.ReadLine();

    至此,一个简单的动态编译程序就完了,我们看到输出的结果为:

    This is a Dynamic Compiler Demo!

    完整的程序清单:

    using System;

     

    using System.Reflection;

    using Microsoft.CSharp;

    using System.CodeDom.Compiler;

     

    public class MyDynamicCompiler

    {

        public static void Main()

        {  

            ///需要编译的字符串

            string MyCodeString=@"

            public class MyTest

            {

                public static string GetTestString()

                {

                    string MyStr = ""This is a Dynamic Compiler Demo!"";

                    return MyStr;

                }

            }";

     

            CompilerParameters compilerParams = new CompilerParameters();

           

            ///编译器选项设置

            compilerParams.CompilerOptions = "/target:library /optimize";

     

            ///编译时在内存输出

            compilerParams.GenerateInMemory = true;

     

            ///生成调试信息

            compilerParams.IncludeDebugInformation = false;

           

            ///添加相关的引用

            compilerParams.ReferencedAssemblies.Add("mscorlib.dll");

            compilerParams.ReferencedAssemblies.Add("System.dll");

     

            ICodeCompiler compiler = new CSharpCodeProvider().CreateCompiler();

     

            ///编译

            CompilerResults results = compiler.CompileAssemblyFromSource(compilerParams,MyCodeString);

           

            ///创建程序集

            Assembly asm = results.CompiledAssembly;

           

            ///获取编译后的类型

            object objMyTestClass = asm.CreateInstance("MyTest");

            Type MyTestClassType=objMyTestClass.GetType();

     

            ///输出结果

            Console.WriteLine(MyTestClassType.GetMethod("GetTestString").Invoke(objMyTestClass,null));

            Console.ReadLine();

        }

    }
    支持TerryLee的创业产品Worktile
    Worktile,新一代简单好用、体验极致的团队协同、项目管理工具,让你和你的团队随时随地一起工作。完全免费,现在就去了解一下吧。
    https://worktile.com
  • 相关阅读:
    HTML(三)
    HTML(二)
    HTML(一)
    Python-数据库索引浅谈
    Django-ORM之聚合和分组查询、F和Q查询、事务
    [LeetCode][Python]String to Integer (atoi)
    [LeetCode][Python]Reverse Integer
    [LeetCode][Python]ZigZag Conversion
    [LeetCode][Python]Longest Palindromic Substring
    [LeetCode][Python]Median of Two Sorted Arrays
  • 原文地址:https://www.cnblogs.com/Terrylee/p/313616.html
Copyright © 2020-2023  润新知