做网站后台管理系统的时候,有时我们需要根据用户的录入配置动态生成一些频道,这些频道需要用到独立的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,让他自动重启就行了。。不知道这么想对不对。。请大手子赐教。。

代码下载: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.net Mvc 动态创建Controller

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

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

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

  3. ASP.NET MVC 3.0 Controller基础

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

  4. ASP.NET MVC动态加载数据

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

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

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

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

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

  7. ASP.NET MVC系列:从Controller访问Model数据

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

  8. Asp.net mvc 中的 Controller 的激活

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

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

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

随机推荐

  1. CentOS7的网卡启动不起来的问题

    这个问题在刚学Linux遇到的,centOS7的网卡启动不起来,导致建不了集群.如下图没有ifconf-env33网卡的IP 还有下面这个图>>> 如果你遇到了,呵呵呵,迷之微笑. ...

  2. 小白也能看懂插件化DroidPlugin原理(一)-- 动态代理

    前言:插件化在Android开发中的优点不言而喻,也有很多文章介绍插件化的优势,所以在此不再赘述.前一阵子在项目中用到 DroidPlugin 插件框架 ,近期准备投入生产环境时出现了一些小问题,所以 ...

  3. 玩玩微信公众号Java版之准备

    微信自2013年流行起来,现在的发展已经超过了我们的想象,那么对应的公众平台,小程序等都是让人眼前一亮的东西,这里来学习一下微信工作号的对接,实现为Java,希望大家一起学习!   这里大概描述一下所 ...

  4. WEB安全:文件上传漏洞

    文件上传漏洞过程 用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力. 一般的情况有: 上传文件WEB脚本语言,服务器的WEB容器解释并执行了用户上传的脚本,导致代码执行: ...

  5. CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction)

    CSharpGL(43)环境映射(Environment Mapping)-天空盒(Skybox)反射(Reflection)和折射(Refraction) 开始 如图所示,本文围绕GLSL里的sam ...

  6. Spring AOP With AspectJ

    一.AOP和拦截器 某些情况下,AOP和拦截器包括Filter能够实现同样的功能,一般都是请求即controller层的操作,这三个执行顺序为Filter>Interceptor>AOP, ...

  7. ASP.NET Core 源码学习之 Logging[2]:Configure

    在上一章中,我们对 ASP.NET Logging 系统做了一个整体的介绍,而在本章中则开始从最基本的配置开始,逐步深入到源码当中去. 默认配置 在 ASP.NET Core 2.0 中,对默认配置做 ...

  8. docke镜像上传到dockerhub仓库和阿里云docker仓库的方法

    操作指南   1.  登录阿里云docker registry: $ sudo docker login --username=linjiaxin897591495 registry.cn-hangz ...

  9. 正则表达式大全 --【Python举例】

    包含 :  纯文字.正负数,小数.正数.正整数.月份.天数.用户名.密码.车牌.传真.手机.邮件.ipv4私有地址.ipv4地址.ipv6地址.json_header.request_header 有 ...

  10. Nodejs package.json文件介绍

    每个npm的安装包里面都会包含一个package.json,通常这个文件会在包的根目录下. 这个文件很类似于.net项目中的.csproj+AssemblyInfo.cs+App.config文件,主 ...