asp.net mvc如何动态编译生成Controller的方法示例详解


本文摘自PHP中文网,作者黄舟,侵删。

本篇文章主要介绍了asp.net mvc 动态编译生成Controller的方法,具有一定的参考价值,有兴趣的可以了解一下

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


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

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,让他自动重启就行了。。不知道这么想对不对。。请大手子赐教。。

以上就是asp.net mvc如何动态编译生成Controller的方法示例详解的详细内容!

相关阅读 >>

asp.net网站发布的过程详解

防止sql注入的asp.net方法实例解析

asp.net中的mvc引擎开发插系统进行详解

asp.net是什么

asp.net core程序发布到linux生产环境详解

asp.net core如何安装?详解asp.net core安装的实例教程

asp.net core实例详解二(环境设置)

解决 asp.net core mysql varchar 字符串截取实例教程

asp.net 验证正则表达式方法总结

asp.net mvc实现404跳转的代码实例

更多相关阅读请进入《asp.net》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...