Heim  >  Artikel  >  Backend-Entwicklung  >  Detailliertes Beispiel dafür, wie asp.net mvc einen Controller dynamisch kompiliert und generiert

Detailliertes Beispiel dafür, wie asp.net mvc einen Controller dynamisch kompiliert und generiert

黄舟
黄舟Original
2017-09-05 15:16:122213Durchsuche

In diesem Artikel wird hauptsächlich die Methode der dynamischen Kompilierung von asp.net mvc zum Generieren eines Controllers vorgestellt, die einen bestimmten Referenzwert hat.

Beim Aufbau eines Website-Backend-Managementsystems können wir uns darauf konzentrieren Die Eingabekonfiguration des Benutzers muss einige Kanäle dynamisch generieren. In diesem Fall ist eine dynamische Kompilierung zur Laufzeit erforderlich. Der Code lautet wie folgt:


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=&#39;/home/creat&#39;>点击动态编译生成TestController</a><br>
              <a href=&#39;/Test/&#39;>访问TestController</a><br>
              <a href=&#39;/Test/WithView&#39;>测试带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;
    }
  }
}

Der Prozess ist wie folgt:

Wenn mvc startet, dort ist nur HomeController, und beim Zugriff auf TestController wird der Fehler 404 angezeigt

Klicken Sie dann, um TestController dynamisch zu kompilieren und eine DLL im Bin-Verzeichnis zu generieren. . Wenn Sie auf klicken, um erneut auf TestController zuzugreifen, ist dieser wieder verfügbar.

Während dieses Vorgangs wird die MVC-Anwendung automatisch neu gestartet. . Da unsere Konfiguration nur für den Hintergrundgebrauch gedacht ist, halte ich es nicht für notwendig, die DLL dynamisch zu laden und sie automatisch neu starten zu lassen. . Ich weiß nicht, ob es richtig ist, so zu denken. . Bitte geben Sie mir einen Rat. .

Das obige ist der detaillierte Inhalt vonDetailliertes Beispiel dafür, wie asp.net mvc einen Controller dynamisch kompiliert und generiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn