动态编译执行c#代码
Microsoft.CSharp.CSharpCodeProvider provider
=
new
Microsoft.CSharp.CSharpCodeProvider();
System.CodeDom.Compiler.ICodeCompiler comp = provider.CreateCompiler();
System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();
cp.ReferencedAssemblies.Add( " system.dll " ) ;
cp.ReferencedAssemblies.Add( " system.data.dll " ) ;
cp.ReferencedAssemblies.Add( " system.xml.dll " ) ;
cp.GenerateExecutable = false ;
cp.GenerateInMemory = true ;
string code = @" using System;
using System.Data;
using System.Xml;
public class Judgement
{
public object GetJude()
{
return ( " + expression + @" );
}
} " ;
System.CodeDom.Compiler.CompilerResults cr = comp.CompileAssemblyFromSource(cp,code);
System.Diagnostics.Debug.Write(code);
if (cr.Errors.HasErrors)
... {
System.Text.StringBuilder errorMsg = new System.Text.StringBuilder();
foreach(System.CodeDom.Compiler.CompilerError err in cr.Errors)
...{
errorMsg.Append(err.ErrorText );
}
System.Diagnostics.Debug.WriteLine(errorMsg.ToString());
throw new System.Exception("编译错误: " + errorMsg.ToString());
//return false;
}
else
... {
System.Reflection.Assembly tmp = cr.CompiledAssembly;
object _Compiled = tmp.CreateInstance("Judgement");
System.Reflection.MethodInfo mi = _Compiled.GetType().GetMethod("GetJude");
return mi.Invoke(_Compiled,null);
}
System.CodeDom.Compiler.ICodeCompiler comp = provider.CreateCompiler();
System.CodeDom.Compiler.CompilerParameters cp = new System.CodeDom.Compiler.CompilerParameters();
cp.ReferencedAssemblies.Add( " system.dll " ) ;
cp.ReferencedAssemblies.Add( " system.data.dll " ) ;
cp.ReferencedAssemblies.Add( " system.xml.dll " ) ;
cp.GenerateExecutable = false ;
cp.GenerateInMemory = true ;
string code = @" using System;
using System.Data;
using System.Xml;
public class Judgement
{
public object GetJude()
{
return ( " + expression + @" );
}
} " ;
System.CodeDom.Compiler.CompilerResults cr = comp.CompileAssemblyFromSource(cp,code);
System.Diagnostics.Debug.Write(code);
if (cr.Errors.HasErrors)
... {
System.Text.StringBuilder errorMsg = new System.Text.StringBuilder();
foreach(System.CodeDom.Compiler.CompilerError err in cr.Errors)
...{
errorMsg.Append(err.ErrorText );
}
System.Diagnostics.Debug.WriteLine(errorMsg.ToString());
throw new System.Exception("编译错误: " + errorMsg.ToString());
//return false;
}
else
... {
System.Reflection.Assembly tmp = cr.CompiledAssembly;
object _Compiled = tmp.CreateInstance("Judgement");
System.Reflection.MethodInfo mi = _Compiled.GetType().GetMethod("GetJude");
return mi.Invoke(_Compiled,null);
}