当前位置: 移动技术网 > IT编程>开发语言>.net > asp.net mvc 动态编译生成Controller的方法

asp.net mvc 动态编译生成Controller的方法

2017年09月07日  | 移动技术网IT编程  | 我要评论

孙雅莉陈平,韦蕴珂,波士顿凯尔特人主场

做网站后台管理系统的时候,有时我们需要根据用户的录入配置动态生成一些频道,这些频道需要用到独立的controller,这时就需要用到运行时动态编译了。代码如下:

using system.web.mvc;
using system.codedom.compiler;
using system.text;
using microsoft.csharp;

namespace dynamiccompiler.controllers
{
  public class homecontroller : controller
  {
    // get: home
    public contentresult index()
    {
      return content(@"
              这个页面是vs生成的<br> 
              <a href='/home/creat'>点击动态编译生成testcontroller</a><br>
              <a href='/test/'>访问testcontroller</a><br>
              <a href='/test/withview'>测试带view的action</a>
            ");
    }

    public contentresult creat()
    {
      string cspath = server.mappath("~/testcontroller.cs");
      var compiler = compilerfromcspath("testcontroller", cspath); //编译

      #region 输出编译信息
      stringbuilder sb = new stringbuilder();
      sb.append("cs文件路径:" + cspath);

      sb.append("编译信息:" + "<br>");
      foreach (string output in compiler.output)
      {
        sb.append(output + "<br>");
      }
      sb.append("错误信息:" + "<br>");
      foreach (compilererror error in compiler.errors)
      {
        sb.append(error.errortext + "<br>");
      }
      #endregion

      return content(sb.tostring());
    }

    /// <summary>
    /// 动态编译并执行代码
    /// </summary>
    /// <param name="cspath">代码</param>
    /// <param name="dllname">输出dll的路径</param>
    /// <returns>返回输出内容</returns>
    private compilerresults compilerfromcspath(string dllname, params string[] cspath)
    {
      string binpath = server.mappath("~/bin/");
      csharpcodeprovider complier = new csharpcodeprovider();
      //设置编译参数
      compilerparameters paras = new compilerparameters();
      //引入第三方dll
      paras.referencedassemblies.add("system.dll");
      paras.referencedassemblies.add("system.linq.dll");
      paras.referencedassemblies.add("system.web.dll");
      paras.referencedassemblies.add(binpath + "system.web.mvc.dll");
      //是否内存中生成输出
      paras.generateinmemory = false;
      //是否生成可执行文件
      paras.generateexecutable = false;
      paras.outputassembly = binpath + dllname + ".dll";
      //编译代码
      compilerresults result = complier.compileassemblyfromfile(paras, cspath);
      return result;
    }
  }
}

流程如下:

 

mvc启动的时候,只有homecontroller,访问testcontroller会提示404错误

 

然后点击动态编译testcontroller,生成dll到bin目录。。再点击访问testcontroller的时候,就是可以访问的状态了。

 

这过程中,mvc应用程序会自动重启的。。因为我们的配置仅仅是后台使用,我觉得没必要再去动态加载dll,让他自动重启就行了。。不知道这么想对不对。。请大手子赐教。。 

代码下载:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网