Pull to refresh

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

Reading time3 min
Views7K
Случаются времена, когда для компиляции сборки или приложения 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), увидим гордый текст «Это работает!».
Tags:
Hubs:
+12
Comments34

Articles

Change theme settings