이 글에서는 asp.net mvc의 동적 컴파일 및 컨트롤러 생성 방법을 주로 소개합니다. 관심이 있는 경우 이에 대해 알아볼 수 있습니다.
웹사이트 백엔드 관리 시스템을 구축할 때 때때로 필요합니다. 사용자의 입력 구성에 따라 동적으로 생성하려면 일부 채널에서는 독립 컨트롤러를 사용해야 합니다. 이 경우 런타임 동적 컴파일이 필요합니다. 코드는 다음과 같습니다.
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가 시작되면 TestController에 액세스하면 404 오류가 발생합니다.
그런 다음 클릭하여 동적으로 컴파일합니다. TestController를 실행하고 bin 디렉터리에 dll을 생성합니다. . TestController에 다시 액세스하기 위해 클릭하면 액세스 가능한 상태가 됩니다.
이 과정에서 mvc 애플리케이션이 자동으로 다시 시작됩니다. . 우리의 구성은 백그라운드 사용만을 위한 것이므로 dll을 동적으로 로드하고 자동으로 다시 시작하도록 할 필요는 없다고 생각합니다. . 그렇게 생각하는 것이 맞는지 모르겠습니다. . 조언 좀 부탁드립니다. .
위 내용은 asp.net mvc가 컨트롤러를 동적으로 컴파일하고 생성하는 방법에 대한 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!