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 core实例详解三(新建项目)

asp.net数据绑定控件详解(图文)

解析webgrid - 非常有用的 asp.net web 帮助器

asp.net实现生成缩略图及加水印的方法示例

asp.net中时间格式化的几种方法

asp.net中healthmonitor属性的用法教程

用signair和push.js完成消息推送代码详解

有关asp.net core 中的多语言支持的详细介绍

asp.net web api 异常处理经验总结

分享19个asp脚本语言的基本技巧

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




打赏

取消

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

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

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

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

评论

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