在asp.net mvc5中动态创建类

时间:2016-10-16 09:58:41

标签: c# asp.net asp.net-mvc entity-framework codedom

我正在使用 EntityFramework CodeFirst,我想创建我的模型和ViewMode类,以编程方式。所以我使用C# CodeDom来创建模型和视图模型类。我可以通过相同的命名空间在cs文件中创建它们......就像你在下面看到的那样,我在dbContext中添加了我的类命名空间......它的工作原理非常好!

    public class MyDBContext : DbContext
{

    public MyDBContext() : base("MyCon")
    {

        Database.SetInitializer<MyDBContext>(new CreateDatabaseIfNotExists<MyDBContext>());
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {

        var entityMethod = typeof(DbModelBuilder).GetMethod("Entity");
        var theList = Assembly.GetExecutingAssembly().GetTypes()
                  .Where(t => t.Namespace == "FullDynamicWepApp.Data.Domins")
                  .ToList();
        foreach (var item in theList)
        {
            entityMethod.MakeGenericMethod(item)
                           .Invoke(modelBuilder, new object[] { });
        }
        base.OnModelCreating(modelBuilder);
    }

}

接下来......当我以编程方式添加cs类时(通过 C# CodeDOM)我必须重建我的包含的项目新的cs文件,进入我的项目..所以我以编程方式构建了我的项目:

          if (ProjectCollection.GlobalProjectCollection.GetLoadedProjects(@"D:\imanSal\SmlpeApp\SmlpeApp\SmlpeApp.csproj").Count == 0)
            {
                p = new Microsoft.Build.Evaluation.Project(@"D:\imanSal\SmlpeApp\SmlpeApp\SmlpeApp.csproj");
            }
            else
            {
                p = ProjectCollection.GlobalProjectCollection.GetLoadedProjects(@"D:\imanSal\SmlpeApp\SmlpeApp\SmlpeApp.csproj").First();
            }





            p.RemoveItem(BuildProj.GetProjectItem(p, outputFileName + this.ClassName + ".cs"));

            p.Save();

            p.Build();

但我的问题是:我无法使用我的新课程(ViewModelsModels ...)直到我再次停止并运行我的项目。这是我最后一个问题,我正在寻找一个解决方案,超过一个星期:(我找不到任何解决方案。我该怎么做?我怎样才能在运行时创建一个类并使用它在运行时......没有“停止并再次运行”我的项目!?

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。实际上codeDOM创建类不会解决我的问题。我需要在iis中创建一个dll并在其中创建我的类,使用CSharpCodeProvider()这样:

      CSharpCodeProvider codeProvider = new CSharpCodeProvider();
        System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
        parameters.GenerateExecutable = false;
        parameters.OutputAssembly = "Per.dll";
        CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, "public class PersonVM{ " + "public int id{get;set;}" +
            "public string Name{get;set;}" + " }");

        Assembly assembly = Assembly.LoadFrom("Per.dll");
        var type = assembly.GetType("PersonVM");
        object obj = Activator.CreateInstance(type, true);
        return View(obj);