ASP.net UserControl и AppDomain TypeResolve - PullRequest
4 голосов
/ 27 июля 2011

Я использую VirtualPathProvider для включения пользовательских элементов управления, которые недоступны во время компиляции.Все работает правильно, за исключением ссылки на dll, которая на самом деле содержит элемент управления.

Когда вызывается страница с элементом управления, он не может найти тип элемента управления, пока я не поместил dll в папку bin.

Ошибка: ошибка синтаксического анализатора Описание: Произошла ошибка во время анализа ресурса, необходимого для обслуживания этого запроса.Пожалуйста, просмотрите следующие подробные сведения об ошибке синтаксического анализа и измените исходный файл соответствующим образом.

Сообщение об ошибке синтаксического анализатора: не удалось загрузить тип 'App.Modules.ModuleA.Controls.Entity1Item'.

Ошибка источника:

Строка 1: <% @ Control Language = "C #" AutoEventWireup = "true" CodeBehind = "Entity1Item.ascx.cs" Inherits = "App.Modules.ModuleA.Controls.Entity1Item"%>

Я пытался обработать все значимые события AppDomain (AssemblyResolve, TypeResolve и ReflectionOnlyAssemblyResolve), но ни один из них не вызывается для моего типа.

В документации TypeResolve я видел, что это вызывается всякий раз, когдаType.GetType выполняется, а тип не найден.Похоже, что ASCX не вызывает событие, когда ему нужен его тип ... почему?

Спасибо!Alex

Ответы [ 2 ]

3 голосов
/ 04 августа 2011

Событие AssemblyResolve должно решить эту проблему, но вам нужно указать имя сборки в имени типа, например,

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Entity1Item.ascx.cs"
    Inherits="App.Modules.ModuleA.Controls.Entity1Item, YourDynamicAssemblyName" %>

После этого событие AssemblyResolve вызовет запрос на загрузку «YourDynamicAssemblyName».

0 голосов
/ 03 августа 2011

Какой контент можно виртуализировать?Доступные для просмотра типы, такие как ASPX, главные страницы, ASCX и темы, являются единственными элементами, которые можно виртуализировать ... Чтобы виртуализировать содержимое, доступное для просмотра не по умолчанию, необходимо сопоставить класс BuildProvider.

«Когда BuildProvider собирается, он создает новый класс в папке Temporary ASP.NET Files. Любой класс, добавленный в папку, автоматически становится доступным для вашего приложения».Так что для меня это выглядит так, как будто вам нужно сопоставить System.Web.Compilation.UserControlBuildProvider для создания ваших пользовательских контроллеров во время выполнения вместо разрешения типа, но сейчас я не знаю, как это сделать.Надеюсь, это все еще полезно

...