Боевое применение компилятора C# для WEB Forms

от автора

Случаются времена, когда для компиляции сборки или приложения Visual Studio использовать не представляется возможным. Звучит это дико, но все-таки иногда случается. Например, необходима компиляция DLL из конфигуратора самописной SCADA-системы. Данный вопрос можно решить использованием класса CSharpCodeProvider. Но мы копнем глубже и создадим WEB Forms приложение без использования Visual Studio. Нашим основным инструментом станет csc.exe. Компилятор, поставляемый вместе с .NET Framework. Матерые программисты пустят скупую слезу, вспомнив свои первые шаги в .NET, а начинающим будет полезно увидеть метод применения компилятора и построение класса WEB Forms приложения. Итак, начнем…

Приготовления и структура нашего мини-проекта
Для начала определимся с функционалом, который мы хотим. Мы хотим WEB Forms приложение, содержащее одну форму default.aspx и которое выводит сообщение «Это работает» в метку на странице.

Структура проекта
%root%\
deploy\
bin\ default.aspx web.config source\ default.aspx.cs deploy.rsp deploy.bat

default.aspx
Ниже приведен код разметки:

<%@ Page Language="C#" AutoEventWireup="false" Inherits="WForms_ByHands.MyPage" %> <!DOCTYPE> <html> <head runat="server"> <title>Ok</title> </head> <body> <form runat="server" id="myForm"> <div> <asp:Label ID="testLabel" runat="server" Text=""></asp:Label> </div> </form> </body> </html>
Имеем форму(form) myForm, и метку(asp:Label) testLabel, в которую мы будем выводить наше сообщение.
К атрибуту «Inherits» директивы @ Page мы вернемся позднее.

default.aspx.cs
using System; namespace WForms_ByHands { public partial class MyPage : System.Web.UI.Page { protected global::System.Web.UI.HtmlControls.HtmlForm myForm; protected global::System.Web.UI.WebControls.Label testLabel; public MyPage() { this.LoadComplete += Page_Load; } protected void Page_Load(object Sender, EventArgs e) { this.testLabel.Text = "Это работает!"; } } }
Мы объявляем класс страницы нашего приложения как WForms_ByHands.MyPage. Этот класс должен быть указан в атрибуте «Inherits» нашей формы. Этот класс будет загружен при обращении к нашей форме. Так как атрибут «AutoEventWireup» имеет значение «false», мы должны в конструкторе явным образом указывать процедуры-обработчики событий. Для примера выбрано событие «LoadComplete» — полная загрузка всех элементов страницы.

Компиляция
Чтобы скомпилировать наше приложение, можем записать все параметры сразу в командную строку, но воспользуемся ответным файлом. Ответный файл может содержать все параметры компилятора и являться единственным параметром в командной строке для csc.exe. Ниже приведен код ответного файла:

/reference:System.Web.dll /*ссылка на сборку, содержащую классы System.Web.UI.HtmlControls.HtmlForm и System.Web.UI.WebControls.Label */ /target:library /out:%root%\deploy\bin\WForms_Handly.dll %root%\source\default.aspx.cs
Также в директорию %root%\deploy необходимо добавить web.config c минимально требуемым кодом:

<?xml version="1.0" encoding="utf-8"?> <configuration></configuration>
Для компиляции проекта создан bat-файл, содержимое которого приведено ниже:

csc @deploy.rsp iisexpress /path:%root%\deploy /port:80 /clr:v4.0 /*эта строка необходима в том случае, если используется IIS Express, в противном случае ее можно удалить. И настроить WEB-приложение в оснастке IIS.*/
В результате выполнения deploy.bat в директории %root%\deploy\bin\ мы обнаружим новый файл — сборку WForms_ByHands.dll приложения. Запросив в браузере URL ресурса (в моем случае http:\\localhost), увидим гордый текст «Это работает!». http://habrahabr.ru/post/251945/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *