做网站后台管理系统的时候,有时我们需要根据用户的录入配置动态生成一些频道,这些频道需要用到独立的控制器,这时就需要用到运行时动态编译了。代码如下:
使用系统网络。手动音量调节使用系统CodeDom。编译器;使用系统。文字;使用微软CSharp .命名空间DynamicCompiler .控制器{公共类家庭控制器:控制器{ //GET: Home公共内容结果索引(){返回内容(@ '这个页面是相对生成的br a href='/home/creat '点击动态编译生成测试控制器访问测试控制器/abr a href='/Test/WithView '测试带视角的行动/a ';}公共内容结果Creat(){字符串cs路径=Server .MapPath(' ~/test controller。cs’);定义变量编译器=compilerformcspath(' Testcontroller ',cs路径);//编译#地区输出编译信息StringBuilder sb=new StringBuilder();某人(某人的简写)追加(' cs文件路径:' cs路径);某人(某人的简写)追加('编译信息:' ' br ');foreach(编译器中的字符串输出。产出)追加(输出" br ");}某人。追加('错误信息:' ' br ');foreach(编译器出错。错误。追加(错误。错误文本" br ");} #endregion返回内容(某人.ToString());} ///摘要///动态编译并执行代码////summary///param name=' cs路径'代码/param ///param name='dllName '输出dll的路径/param /返回返回输出内容/返回私有编译器结果编译器表单路径(字符串dllName,参数字符串[]CSpath){ 0字符串binpath=服务器.MapPath(' ~/bin/');CSharpCodeProvider编译器=new csharpcode提供程序();//设置编译参数编译器参数=新的编译器参数();//引入第三方dll段落参考组件。添加('系统。dll ');第100-100段参考组件。添加('系统。linq。dll ');第100-100段。参考组件。添加('系统网络。dll ');第100-100段。参考组件。添加(双路径)系统网络。Mvc。dll ');//是否内存中生成输出第100-100段GenerateInMemory=false//是否生成可执行文件第100-100段GenerateExecutable=false第100-100段OutputAssembly=binpath dllName ' .dll ';//编译代码编译器结果=编译器. CompileAssemblyFromFile(段落,cs路径);返回结果;} }}流程如下:
手动音量调节启动的时候,只有家庭控制器,访问测试控制器会提示404错误
然后点击动态编译测试控制器,生成dll到容器目录。再点击访问测试控制器的时候,就是可以访问的状态了。
这过程中,mvc应用程序会自动重启的。因为我们的配置仅仅是后台使用,我觉得没必要再去动态加载dll,让他自动重启就行了。不知道这么想对不对。请大手子赐教。
代码下载:动态-控制器
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。