我有一个设置,在控制器中通过CodeDomProvider动态构建MVC模型类,如下面的代码所示:
//model source is properly structured C# code
CodeDomProvider cdProvider = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cParams = new CompilerParameters();
cParams.GenerateInMemory = false;
cParams.TreatWarningsAsErrors = false;
cParams.WarningLevel = 4;
cParams.OutputAssembly = string.Format(@"{0}\{1}", Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), modelNamespace+".dll");
cParams.ReferencedAssemblies.AddRange(modelFrameworkReferences.ToArray());
try
{
CompilerResults cResults = cdProvider.CompileAssemblyFromSource(cParams, modelSource);
modelAssembly = cResults.CompiledAssembly;
// omitted for brevity....
}
这很好,模型生成(并缓存供以后使用),然后通过modelAssembly.CreateInstance创建它的实例。
该项目还使用自定义的VirtualPathProvider和VirtualFile实现来从一些外部存储中提供Razor视图标记。检索部分工作正常,但是当框架编译Razor视图时,编译失败,因为视图引用动态生成的程序集中的类型。
查看csc.exe的视图编译命令行显示,即使生成的程序集在appdomain中加载(通过列出程序集验证)和视图标记,也不会在命令行中包含对动态生成的库的引用-up包含引用生成的程序集的命名空间的正确的@using指令。
是否可以采取一些措施来确保为视图编译引用动态生成的程序集类型?
我理解我可以使用动态模型方法,并且我可以让所有动态生成的模型类派生自视图可以引用的预定义(非动态)接口,但出于各种原因,我希望对动态生成的模型本身的引用。