C# 在asp.net mvc5中动态创建类
我正在使用EntityFrameworkC# 在asp.net mvc5中动态创建类,c#,asp.net,asp.net-mvc,entity-framework,codedom,C#,Asp.net,Asp.net Mvc,Entity Framework,Codedom,我正在使用EntityFrameworkCodeFirst,我想以编程方式创建我的模型和ViewModes类。所以我使用C#CodeDom来创建模型和视图模型类。我可以通过相同的名称空间在cs文件中创建它们。。。正如您在下面看到的,我在dbContext中添加了我的类名称空间。。。而且它非常有效 public class MyDBContext : DbContext { public MyDBContext() : base("MyCon") { D
CodeFirst
,我想以编程方式创建我的模型和ViewMode
s类。所以我使用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);
}
}
但我的问题是:我不能使用我的新类(
ViewModels
和Models
…),除非我停止并再次运行我的项目。这是我一个多星期以来一直在寻找解决方案的最后一个问题:(我还没有找到任何解决方案。我必须做什么?我如何在运行时创建一个类,并在运行时使用它来…而不“停止并运行”又是我的项目!?我找到了解决方案。实际上通过codeDOM
创建类并不能解决我的问题。我需要在iis中创建dll
,并在其中创建我的类,使用以下方法:
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();
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);
我找到了解决方案。实际上,通过
codeDOM
创建类并不能解决我的问题。我需要在iis中创建dll
,并在其中创建我的类,使用如下方法:
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();
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);
这和你的问题有什么不同?事实上我需要答案。不是检查员。这和你的问题有什么不同?事实上我需要答案。不是检查员