ASP.Net MVC 3 - динамически скомпилированная сборка, используемая в качестве модели в пользовательском представлении виртуального пути - PullRequest
3 голосов
/ 21 октября 2011

У меня есть установка, где классы моделей 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, ссылающуюся на пространство имен сгенерированной сборки.

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

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

...