2012-12-28 42 views
1

我可以動態創建一個類,然後實例化它並從Visual Studio中的立即窗口調用它內部的一個方法。但我不能讓一個MVC控制器類的行爲像預期的那樣(即找到並路由到)。我錯過了什麼?試圖用Roslyn動態創建一個MVC控制器

的Global.asax.cs:

protected void Application_Start() 
    { 
     RoslynExperiments.AddController(); 
     RegisterRoutes(RouteTable.Routes); 

...

RoslynExperiments:

public static void AddController() 
    { 

     var controllerCode = @"using System.Web.Mvc; 

    public class FooController:Controller 
    { 
     public ActionResult Index() 
     { 
      return Content(""foo""); 
     } 
    } 
"; 

     AddDynamicAssemblyClass("FooController", controllerCode); 

    } 


    public static void AddDynamicAssemblyClass(string inMemoryAssemblyName, string code) 
    { 
     var syntaxTree = SyntaxTree.ParseText(code); 

     var refs = new[] { 
      MetadataReference.CreateAssemblyReference("mscorlib"), 
      MetadataReference.CreateAssemblyReference("System"), 
      MetadataReference.CreateAssemblyReference("System.Web"), 
      MetadataReference.CreateAssemblyReference("System.Web.MVC") 
     }; 

     var compilation = Compilation.Create(inMemoryAssemblyName, 
     syntaxTrees: new[] { syntaxTree }, 
     references: refs, 
     options: new CompilationOptions(OutputKind.DynamicallyLinkedLibrary)); 

     using (var memoryStream = new MemoryStream()) 
     { 
      EmitResult result = compilation.Emit(memoryStream); 
      memoryStream.Flush(); 
      var assembly = Assembly.Load(memoryStream.GetBuffer()); 
     } 

    } 

回答

1

我沒有與ASP.NET MVC rounting多少經驗,但根據one comment,只考慮引用程序集的控制器,而不是所有加載的程序集。

因此,我認爲你需要使用自定義ControllerFactory