转自:http://blog.joycode.com/ghj/archive/2004/02/14/13037.aspx
.net 中其实可以实现动态编译,这样就可以让用户拥有一定的可编程控制能力。对用户来说,就可以把自己的业务逻辑处理过程自己编码来实现。这个功能是非常有意义的,对用户的吸引力也非常大。
其核心是调用.net的编译器,下面以C#代码为例:
private System.Reflection.Assembly mAssembly;
Microsoft.CSharp.CSharpCodeProvider provider;
System.CodeDom.Compiler.ICodeCompiler compiler;
System.CodeDom.Compiler.CompilerParameters parameters;
System.CodeDom.Compiler.CompilerResults results;
parameters = new System.CodeDom.Compiler.CompilerParameters();
parameters.GenerateInMemory = true; // 在内存中创建程序集
parameters.TreatWarningsAsErrors = false;
parameters.WarningLevel = 4;
// 此处添加所需要的引用 -- 甚至可以是按照需要自定义的dll
string[] refs = {"System.dll","Microsoft.VisualC.Dll"};
parameters.ReferencedAssemblies.AddRange(refs);
try
{
provider = new Microsoft.CSharp.CSharpCodeProvider();
compiler = provider.CreateCompiler();
results = compiler.CompileAssemblyFromSource(parameters,rtb_Code.Text);
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return;
}
if (results.Errors.Count == 0)
{
mAssembly = results.CompiledAssembly;
}
StringBuilder build = new StringBuilder();
rtb_ErrorInfo.Text = "";
foreach(System.CodeDom.Compiler.CompilerError err in results.Errors)
{
string str = string.Format("Line {0},Col {1},Error {2} - {3}",err.Line,err.Column,err.ErrorNumber,err.ErrorText);
build.Append(str);
}
rtb_ErrorInfo.Text = build.ToString();
调用可以参看下面的代码:
Type scriptType;
Object rslt;
try
{
scriptType = mAssembly.GetType("Sample");
Object[] args = {tb_input.Text};
rslt = scriptType.InvokeMember("StaticFunction",System.Reflection.BindingFlags.InvokeMethod
|System.Reflection.BindingFlags.Public|
System.Reflection.BindingFlags.Static,null,null,args);
if (rslt != null)
{
tb_output.Text = rslt.ToString();
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
有关这个技术的更详细描述可以看下面的连接:
http://www.codeproject.com/vb/net/DotNetCompilerArticle.asp
您可以在2004年2月刊《CSDN开发高手》中找到这篇文章的中文翻译。