Я пытаюсь создать веб-приложение ASP.Net, которое хранит свой «контент» (ASPX / ASCX и сборки) где-то, кроме файловой системы (например, внутри службы), и загружает их динамически по мере необходимости.
Я успешно создал VirtualPathProvider, который заботится о чтении файлов ASPX / Master / ASCX из альтернативных местоположений, но у меня возникают проблемы, когда эти страницы ASPX наследуют класс, то есть: когда у них есть код позади.
Благодаря ответам в другой вопрос Теперь я могу успешно загружать сборки в приложение во время выполнения. Но когда моя среда выполнения пытается скомпилировать мою страницу, я получаю следующую ошибку:
"Сообщение об ошибке компилятора: CS0400: The
имя типа или пространства имен 'Web' не может
быть найдены в глобальном пространстве имен (являются
вам не хватает ссылки на сборку?) "
[System.Runtime.CompilerServices.CompilerGlobalScopeAttribute ()]
открытый класс default_aspx
: global :: Web.Code.CodeBehind,
System.Web.SessionState.IRequiresSessionState,
System.Web.IHttpHandler
Я свел свой код к простому примеру того, что идет не так, чтобы вам было легко это увидеть. Вы можете скачать этот код здесь .
Сборка загружается динамически во время выполнения с помощью события AppDomain.AssemblyResolve. Это в global.asax и выглядит так:
protected void Application_Start(object sender, EventArgs e)
{
AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(Assembly_Resolve);
}
Assembly Assembly_Resolve(object sender, ResolveEventArgs args)
{
Assembly assembly = AppDomain.CurrentDomain.Load(Resources.Web_Code);
if (args.Name == assembly.FullName)
{
return assembly;
}
return null;
}
Есть идеи?
EDIT
Если по какой-либо причине вам необходимо обновить сборку Web.Code - вам необходимо скопировать ее в папку «ReferencedAssemblies» веб-проекта, чтобы эти изменения вступили в силу.