Maison  >  Article  >  développement back-end  >  Exemple détaillé de la façon dont asp.net mvc compile et génère dynamiquement un contrôleur

Exemple détaillé de la façon dont asp.net mvc compile et génère dynamiquement un contrôleur

黄舟
黄舟original
2017-09-05 15:16:122249parcourir

Cet article présente principalement la méthode de compilation dynamique asp.net mvc pour générer un contrôleur, qui a une certaine valeur de référence. Ceux qui sont intéressés peuvent en apprendre davantage

Lors de la création d'un système de gestion backend de site Web, parfois nous. besoin La configuration d'entrée de l'utilisateur génère dynamiquement certains canaux. Ces canaux nécessitent l'utilisation de contrôleurs indépendants. Dans ce cas, une compilation dynamique d'exécution est requise. Le code est le suivant :


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;
    }
  }
}

Le processus est le suivant :

Quand mvc démarre, il y a est uniquement HomeController, et l'accès à TestController affichera une erreur 404

Cliquez ensuite pour compiler dynamiquement TestController et générer une DLL dans le répertoire bin. . Lorsque vous cliquez à nouveau pour accéder à TestController, il sera accessible.

Pendant ce processus, l'application mvc redémarrera automatiquement. . Parce que notre configuration est uniquement destinée à une utilisation en arrière-plan, je ne pense pas qu'il soit nécessaire de charger dynamiquement la DLL et de la laisser redémarrer automatiquement. . Je ne sais pas si c’est juste de le penser. . S'il vous plaît, donnez-moi quelques conseils. .

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn