この記事では、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における動的コンパイルとControllerの生成方法を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。