Динамически загружаемый класс / сборка страницы: невозможно найти тип или имя в глобальном пространстве имен - PullRequest
1 голос
/ 30 июля 2009

Я пытаюсь создать веб-приложение 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» веб-проекта, чтобы эти изменения вступили в силу.

Ответы [ 2 ]

1 голос
/ 02 ноября 2009

Я столкнулся с той же проблемой при попытке загрузить сборки из БД (и при использовании события AssemblyResolve). Но, похоже, все работает нормально, если вы загружаете сборки с диска или хотя бы сохраняете копию файла .dll где-то на диске.

0 голосов
/ 31 июля 2009

OK.Можете попробовать следующее - удалите событие AssemblyResolve.Теперь мы будем использовать конфигурацию среды выполнения web.config для разрешения этих сборок.В конфигурации <runtime> добавьте следующее:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <probing privatePath="ReferencedAssemblies" />
</assemblyBinding>

Я не могу объяснить себе, почему два подхода - AppDomain.AssemblyResolve и это AssemblyBinding времени выполнения дают разные результаты при работе с PageBuildProvider.Я искал класс PageBuildProvider, чтобы найти какие-либо подсказки о том, что происходит, но все равно не повезло.Я, вероятно, посмотрю дальше, так как это привлекло мое внимание и опубликует здесь, если я найду какое-либо решение.

Дайте мне знать, работает ли это решение с файлом web.config для васЕдинственное предостережение в том, что вы не можете использовать ресурсы для хранения ваших сборок.Вам необходимо хранить их в файловой системе, в любой папке, которая находится в рамках проекта - как в настоящее время в папке ReferencedAssemblies.

...