У меня есть установка, где классы моделей MVC создаются на лету в контроллере, обслуживающем запрос через CodeDomProvider, как показано в следующем коде:
//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 показывает, что ссылка на динамически сгенерированную библиотеку не включена в командную строку, даже если сгенерированная сборка загружена в домен приложения (проверяется путем перечисления сборок) иразметка представления содержит правильную директиву @using, ссылающуюся на пространство имен сгенерированной сборки.
Есть ли что-то, что может быть сделано для обеспечения ссылки на динамически сгенерированные типы сборки для компиляции представления?
Я понимаю, что могу использовать подход динамической модели и что все динамически генерируемые классы моделей могут быть получены из предопределенного (не динамического) интерфейса, на который могут ссылаться представления, но по разным причинам я хотел бы иметьссылка на саму динамически генерируемую модель.