(转贴)一个C#动态编译的小例子

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

namespace  ConsoleApplication1
{
    
/// <summary>
    
/// Class1 的摘要说明。
    
/// </summary>

    class Class1
    
{
        
/// <summary>
        
/// 应用程序的主入口点。
        
/// </summary>

        [STAThread]
        
static void Main(string[] args)
        
{
            
int a = 100,b = 80, c =70;
            
string statement = string.Format("int a={0},b = {1},c = {0};", a, b, c);
            
string expressions = "(a + b) * 0.2 + c + (a - c * 0.1 )";
            Console.WriteLine(GetValue(statement,expressions).ToString());
        }

        
public static object GetValue(string statement, string expressions)
        
{
            
string codeSnippet = "using System; " + " " +
                
"namespace SnippetCompiler {" + " " +
                
" public class Eval" + " " +
                
" {" + " " +
                
"       public Eval(){} " + " " +
                
"  public object GetValue()" + " " +
                
"  {" + " " + statement + " " +
                
"   return " + expressions + ";" + " " +
                
"  }" + " " +
                
" } }";
            CodeSnippetCompileUnit unit 
= new CodeSnippetCompileUnit(codeSnippet);

            ICodeCompiler compiler 
= new CSharpCodeProvider().CreateCompiler();
            CompilerParameters para 
= new CompilerParameters();
            para.ReferencedAssemblies.Add(
"System.dll");
            para.GenerateInMemory 
= true;
            para.GenerateExecutable 
= false;
            para.OutputAssembly 
= "Eval.dll";

            Assembly asm 
= compiler.CompileAssemblyFromDom(para, unit).CompiledAssembly;

            Type type 
= asm.GetType("SnippetCompiler.Eval");
            MethodInfo mi 
= type.GetMethod("GetValue", BindingFlags.Public | BindingFlags.Instance);

            
object obj = asm.CreateInstance("SnippetCompiler.Eval");
            
return mi.Invoke(obj, null);
        }

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值