>  기사  >  백엔드 개발  >  asp.net mvc가 컨트롤러를 동적으로 컴파일하고 생성하는 방법에 대한 자세한 예

asp.net mvc가 컨트롤러를 동적으로 컴파일하고 생성하는 방법에 대한 자세한 예

黄舟
黄舟원래의
2017-09-05 15:16:122213검색

이 글에서는 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=&#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;
    }
  }
}

프로세스는 다음과 같습니다.

mvc가 시작되면 TestController에 액세스하면 404 오류가 발생합니다.

그런 다음 클릭하여 동적으로 컴파일합니다. TestController를 실행하고 bin 디렉터리에 dll을 생성합니다. . TestController에 다시 액세스하기 위해 클릭하면 액세스 가능한 상태가 됩니다.

이 과정에서 mvc 애플리케이션이 자동으로 다시 시작됩니다. . 우리의 구성은 백그라운드 사용만을 위한 것이므로 dll을 동적으로 로드하고 자동으로 다시 시작하도록 할 필요는 없다고 생각합니다. . 그렇게 생각하는 것이 맞는지 모르겠습니다. . 조언 좀 부탁드립니다. .

위 내용은 asp.net mvc가 컨트롤러를 동적으로 컴파일하고 생성하는 방법에 대한 자세한 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.