C# 尝试使用Roslyn动态创建MVC控制器

C# 尝试使用Roslyn动态创建MVC控制器,c#,asp.net-mvc,roslyn,C#,Asp.net Mvc,Roslyn,我可以动态创建一个类,然后实例化它,并从VisualStudio的即时窗口调用其中的一个方法。但我无法使MVC控制器类的行为符合预期(即被找到并路由到)。我错过了什么 Global.asax.cs: protected void Application_Start() { RoslynExperiments.AddController(); RegisterRoutes(RouteTable.Routes); 罗斯林实验: public

我可以动态创建一个类,然后实例化它,并从VisualStudio的即时窗口调用其中的一个方法。但我无法使MVC控制器类的行为符合预期(即被找到并路由到)。我错过了什么

Global.asax.cs:

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

罗斯林实验:

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

    }

我对ASP.NET MVC编程没有太多经验,但根据,只考虑引用程序集的控制器,而不是所有加载的程序集的控制器


因此,我认为您需要使用自定义的
ControllerFactory

我对ASP.NET MVC编程没有太多经验,但根据,只考虑引用程序集的控制器,而不是所有加载的程序集的控制器

因此,我认为您需要使用定制的
ControllerFactory