Использование провайдеров компиляции в Asp.netИсточник: realcoding
В Asp.net любая интернет-страница представляется в виде двух файлов: *.aspx и *.aspx.cs. В *.aspx-файлах содержится html-подобная разметка самой страницы, а в *.aspx.cs-файлах код на языке C#, который представлен в виде отдельного класса. В разметку страницы можно добавлять серверные элементы управления, например тегом <asp: Button ID="MyButton" runat="server" />. Причём с каждым таким объявлением будет связана переменная, то есть в нашем случае мы получим доступ к переменной типа Button и именем MyButton, хотя на первый взгляд эта переменная нигде не объявлена. (Хотя в первой версии Asp.net объявление переменных вставлялись в тот же файл.) На самом деле это не так. Класс, описаный в *.aspx.cs-файле является частичным (он помечен модификатором partial), одна его часть описана в *.aspx.cs-файле, а вторая находится во временном файле, который генерируется на основании просмотра *.aspx-файла. Генерацией этого временного файла как раз и занимается провайдер компиляции. Пишем провайдер компиляции1. Определимся, что будет делать провайдер компиляции. Чтобы особо не мудрить, пусть он выполняет преобразование xml-файла вида:
в статический класс, содержащий константы. 2. Создадим новый проект. В качестве типа проекта выберем "Class Library", назовём его "MyLib". 3. Все провайдеры компиляции являются производными от класса "System.Web.Compilation.BuildProvider", поэтом добавим ссылку на сборку "System.Web" и используемые пространства имён. Конструктор класса ничего не выполняет, а вот метод "GenerateCode" нам потребуется переопределить. В итоге должно получиться следующее:
Компилируем и получаем сборку. 4. Создаём новый сайт (Назовём его MySite). Первое, что нужно сделать, создать папки bin и App_Code. В папку bin скопируем только что созданную библиотеку. Теперь нужно подключить провайдер компиляции. Для этого идём в файл Web.config и в разделе compilation добавляем блок:
Это определение говорит, что для файлов с расширением "cc" будет использован провайдер компиляции MyLib.MyBP, который будет взят из сборки MyLib". 5. Создаём файл "my.cc" в папке "App_Code" с xml-кодом, вроде того, что приведён выше. Через некоторое время (обычно секунд десять, когда файл обработается) в любом C#-коде можно будет использовать классы "C1" и "C2" и их константные поля. (Результаты можно увидеть на скриншотах) 6. Скриншоты: Документ, обрабатываемый провайдером компиляции:
Ну и в качестве концовкиБезусловно данный пример не может претендовать на полноценный провайдер компиляции, а показывает только общую идею, в коде я опустил многие проверки, обработку исключений пожертвовал оптимальностью ради сокращения кода. PS: Я не нашёл способа не помещать провайдер в отдельную сборку, а просто добавить класс в папку App_Code. В данном случае возникает ошибка о невозможности загрузить тип. |