小桥

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

转自: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开发高手》中找到这篇文章的中文翻译。

posted on 2005-03-18 08:48  小桥  阅读(372)  评论(0编辑  收藏  举报