モデルとコントローラー クラスを生成するコードがいくつかあります。
public ActionResult Generate()
{
ModelGenerator model = new ModelGenerator("c:/Upload/SampleModel.cs", "CodeDOMSample");
model.addProperties();
model.addConstructor();
model.GenerateCSharpCode(model._outputFileName);
Type t = Generator.CompileDOM(model.targetUnit, "c:/Upload/ModelCode.dll", model.assemblies());
ControllerGenerator controller = new ControllerGenerator("c:/Upload/SampleController.cs", "CodeDOMSample",t);
controller.GenerateCSharpCode(controller._outputFileName);
Generator.CompileDOM(controller.targetUnit, "c:/Upload/ControllerCode.dll", controller.assemblies());
// Somehow register compiled Controller to MVC
return RedirectToAction("About");
}
生成されるコントローラ コードは次のようになります。
//------------------------------------------------------------------------------
// <auto-generated>
// Dieser Code wurde von einem Tool generiert.
// Laufzeitversion:4.0.30319.1
//
// Änderungen an dieser Datei können falsches Verhalten verursachen und gehen verloren, wenn
// der Code erneut generiert wird.
// </auto-generated>
//------------------------------------------------------------------------------
namespace CodeDOMSample
{
using System;
using System.Web;
using System.Web.MVC;
// Copyright (c) AdaPro GmbH. All rights reserved.
public sealed class QuestionController : PlatformController<CodeDOMSample.Question>
{
}
}
/Question の呼び出しが「リソースが見つかりません」で終了しないように、コンパイルされたコントローラーを mvc フレームワークに登録するにはどうすればよいですか?
問題はルートテーブルではないと思います。
return RedirectToAction("Index", t.Name);
うまくいきません。これにはルート登録は必要ないと思います。私が持っているルート登録は、かなり一般的で標準的なものです。
routes.MapRoute(
"Default", // Routenname
"{controller}/{action}/{id}", // URL mit Parametern
new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameterstandardwerte
);
MVC では Controller が特定のディレクトリにある必要があることを覚えていますが、この場合はそうではありません。しかし、それは本当に奇妙な慣習でしょうか。つまり、MVC はディレクトリ情報に対して何をするのでしょうか? それはそれをスキャンし、起動時に何らかの方法でコントローラーを登録します。では、後で登録しないのはなぜですか?ただ - どうやって?!?
また、組み立ても問題ないと思います。
私はこのコードを持っています:
// Invoke compilation.
CompilerResults cr = provider.CompileAssemblyFromDom(cp, cu);
Type t = cr.CompiledAssembly.GetExportedTypes().First();
return t;
t はコンパイルされた型を返します。したがって、コンパイル後にすでにロードされていると想定しています。そうでなければ、t はわかりません。また、出力ウィンドウで、それがロードされていることを確認できます。