asp.net mvc 动态编译生成Controller

时间:2022-09-06 22:18:57

做网站后台管理系统的时候,有时我们需要根据用户的录入配置动态生成一些频道,这些频道需要用到独立的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;
}
}
}

流程如下:

asp.net mvc 动态编译生成Controller

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

asp.net mvc 动态编译生成Controller

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

asp.net mvc 动态编译生成Controller

asp.net mvc 动态编译生成Controller

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

代码下载:https://files.cnblogs.com/files/wxb8/%E5%8A%A8%E6%80%81%E7%BC%96%E8%AF%91.zip

asp.net mvc 动态编译生成Controller的更多相关文章

  1. asp&period;net Mvc 动态创建Controller

    有这么个需求,Urls如下: http://localhost:52804 http://localhost:52804/home/test http://localhost:52804/test1 ...

  2. 白话ASP&period;NET MVC之三:Controller是如何解析出来的

    我们在上一篇文章中介绍Controller激活系统中所涉及到的一些类型,比如有关Controller类型的相关定义类型就包括了IController类型,IAsyncController类型,Cont ...

  3. ASP&period;NET MVC 3&period;0 Controller基础

    ASP.NET MVC 3.0 Controller基础   1.Controller类与方法 Controller(控制器)是ASP.NET MVC的核心,负责处理浏览器请求,并作出响应.Cotro ...

  4. ASP&period;NET MVC动态加载数据

    ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分:  Source Code 上图中,有一行代码: <tbody ...

  5. ASP&period;NET MVC动态生成网站菜单及子菜单

    在开发ASP.NET MVC网站时,Insus.NET想实现动态产生网站的主菜单及子菜单. 你需要在网站管理后台管理此2张表(Menu,SubMenu)的信息,添加,删除,编辑,更新等. Sequen ...

  6. 【转】ASP&period;NET MVC学习笔记-Controller的ActionResult

    1. 返回ViewResult public ActionResult Index()   {       ViewData["Message"] = "Welcome ...

  7. ASP&period;NET MVC系列&colon;从Controller访问Model数据

    在项目解决方案中,添加一个MoviesController控制器,选择对应的模板,和模型类以及数据上下文:关于如何添加模型类和数据上下文,我们在ASP.NET MVC系列:添加模型中已经介绍过

  8. Asp&period;net mvc 中的 Controller 的激活

    Controller 激活是指根据路由系统解析出来的 Controller 的名称创建 控制器(Controller)的过程,这里的控制器泛指实现了 IController 接口的类型 激活过程中的核 ...

  9. ASP&period;NET mvc下在Controller下action的跳转方式

    在ASP.NET mvc下,action有多种挑战方式: return RedirectToAction("Index");//一个参数时在本Controller下 如果Redir ...

随机推荐

  1. STM32L时钟

    Four different clock sources can be used to drive the system clock (SYSCLK): 1.HSI ((high-speed inte ...

  2. 用命令查看Mysql中数据库、表的空间大小

    要想知道每个数据库的大小的话,步骤如下:1.进入information_schema 数据库(存放了其他的数据库的信息)use information_schema;2.查询所有数据的大小:selec ...

  3. meta标签的http-equiv与content解析

    meta是html语言head区的一个辅助性标签,以下是meta的http-equiv属性和content属性的一些介绍. http-equiv属性 指示服务器在发送实际的文档之前,要在传送给浏览器的 ...

  4. &lbrack;Luogu 3787&rsqb; 冰精冻西瓜

    Description 琪露诺是拥有操纵冷气程度的能力的妖精,一天她发现了一片西瓜地.这里有n个西瓜,由n-1条西瓜蔓连接,形成一个有根树,琪露诺想要把它们冷冻起来慢慢吃. 这些西瓜蔓具有神奇的性质, ...

  5. http协议的状态码解释

    一些常见的状态码为: 200 – 服务器成功返回网页 404 – 请求的网页不存在 503 – 服务器超时 下面提供 HTTP 状态码的完整列表.点击链接可了解详情.您也可以访问 HTTP 状态码上的 ...

  6. Linux 第五章 学习笔记

    ---恢复内容开始--- 第五章 系统调用 一.与内核通信 1.系统调用在用户控件进程和硬件设备之间添加了一个中间层. 为用户空间提供了一种硬件的抽象接口 系统调用保证了系统的稳定和安全 每个进程都运 ...

  7. android 开发 ANR

    记录一下: 问题出现原因:自定义加载对话框导致,查明是否有引用dialog的地方.

  8. Eclipse 创建 Java 类

    打开新建 Java 类向导 你可以使用新建 Java 类向导来创建 Java 类,可以通过以下途径打开 Java 类向导: 点击 "File" 菜单并选择 New > Cla ...

  9. Pycharm设置Python的路径

    1. 打开文件->默认设置 2. 找到Python的路径即可,如果没有的话,这里也可以安装一个,只是时间比较久. 3. 选择本地 4. 选择文件

  10. 软件模拟I2C时输入与输出切换

    一 为达到类似C51的操作需要添加以下位带操作:#include "stm32f10x_gpio.h"#include "stm32f10x_conf.h" / ...