Случаются времена, когда для компиляции сборки или приложения 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
- deploy
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%deploybinWForms_Handly.dll
%root%sourcedefault.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%deploybin мы обнаружим новый файл — сборку WForms_ByHands.dll приложения. Запросив в браузере URL ресурса (в моем случае http:\localhost), увидим гордый текст «Это работает!».
Автор: Crong