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

黄舟
Libérer: 2017-09-05 15:16:12
original
2219 Les gens l'ont consulté

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;
    }
  }
}
Copier après la connexion

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!