1

クラスを動的に作成し、それをインスタンス化して、Visual Studio の直接のウィンドウからその中のメソッドを呼び出すことができます。しかし、MVC コントローラー クラスを期待どおりに動作させることはできません (つまり、見つけてルーティングする)。私は何が欠けていますか?

Global.asax.cs:

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

...

Roslyn実験:

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

    }
4

1 に答える 1

1

ASP.NET MVC のルーティングの経験はあまりありませんが、1 つのコメントによると、読み込まれたすべてのアセンブリからではなく、参照されたアセンブリからのコントローラーのみが考慮されます。

そのため、カスタムを使用する必要があると思いますControllerFactory

于 2012-12-28T21:15:49.350 に答える