ASP.Net MVC 3 — Динамически скомпилированная сборка, используемая в качестве модели в пользовательском представлении поставщика виртуального пути

#.net #dynamic #razor #assemblies

#.net #динамический #razor #сборки

Вопрос:

У меня есть настройка, в которой классы моделей 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 view из некоторого внешнего хранилища. Часть поиска работает нормально, но когда фреймворком компилируется представление Razor, компиляция завершается с ошибкой, поскольку представление ссылается на тип в динамически сгенерированной сборке.

Просмотр командной строки компиляции представления для csc.exe показывает, что ссылка на динамически сгенерированную библиотеку не включена в командную строку, даже если сгенерированная сборка загружена в appdomain (проверяется путем перечисления сборок), а разметка представления содержит соответствующую директиву @using, ссылающуюся на пространство имен сгенерированной сборки.

Можно ли что-то сделать, чтобы гарантировать, что ссылки на динамически сгенерированные типы сборок используются для компиляции представления?

Я понимаю, что могу использовать подход динамической модели и что я могу иметь все динамически сгенерированные классы моделей, производные от предопределенного (нединамического) интерфейса, на который могут ссылаться представления, но по разным причинам я хотел бы иметь ссылку на саму динамически сгенерированную модель.