В этой заметке я расскажу, как построить две очень простые программы на платформе .NET. Первая программа будет консольная (Console User Interface — CUI), вторая — графическая (Graphical User Interface — GUI) на базе библиотеки Windows Presentation Foundation (WPF). Разговор о том, что вообще такое платформа .NET, отложим до следующей заметки.
Средства разработки
Вы можете установить графическую среду разработки Visual Studio, но я предпочитаю начинать изучение с по возможности самых низкоуровневых средств разработки, которые запускаются из командной строки, так как они, на мой взгляд, в меньшей степени скрывают от программиста разные детали. Для начала нам будет достаточно компилятора языка C#. Где взять компилятор? Компилятор csc.exe поставляется вместе с .NET Framework, однако эта версия компилятора больше не разрабатывается фирмой Microsoft, в виду чего она несколько устарела — поддерживает лишь 5-ю версию языка C#. Более новый проект компилятора C# называется Roslyn (впрочем исполняемый файл компилятора по-прежнему называется csc.exe). Компилятор Roslyn поставляется только в составе Visual Studio (начиная от VS2015 и дальше). Впрочем, вы можете построить Roslyn из исходников, клонировав репозиторий (репозиторий весит около 2 гигабайт). И Visual Studio, и .NET Framework можно скачать на странице .NET Downloads.
На моем компьютере установлена .NET Framework 4.7.1. Компилятор csc.exe лежит в папке C:\Windows\Microsoft.NET\Framework\v4.0.30319
.
Также на моем компьютере установлена Visual Studio 2017 Community, поэтому компилятор Roslyn находится в папке C:\Program Files\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn
Консольная программа HelloWorld
Сейчас мы напишем консольную программу, которая будет выводить на экран строку «Hello World!». Запустите командную строку cmd.exe. Далее создайте папку HelloWorld:
В папке HelloWorld создайте файл Program.cs:
touch Program.cs
Теперь откроем файл Program.cs блокнотом:
и введем следующий код:
namespace MyNamespace
{
public class Program
{
// The method "public static void Main()" is the default entry point in C# programs
public static void Main()
{
Console.WriteLine("Hello World!");
Console.Write("Press enter to exit...");
Console.ReadLine();
}
}
}
Компиляция исходного кода
Запуская компилятор csc.exe из командной строки, вы должны указать ему название выходного файла (ключ /out) и путь к файлу исходного кода (в нашем случае — Program.cs). Скомпилируем исходный код компилятором, который поставляется в составе .NET Framework:
Также можно скомпилировать исходный код компилятором Roslyn (если у вас установлена Visual Studio) — далее я буду пользоваться именно им:
Обратите внимание на двойные кавычки в пути к компилятору — они необходимы, так как путь содержит пробелы.
Теперь в папке HelloWorld появился файл HelloWorld.exe, который мы можем запустить:
Hello World!
Press enter to exit...
Жмем [Enter], и программа завершается.
Графическая программа HelloWorld на базе WPF
WPF — это API для разработки графических приложений на платформе .NET. API состоит из большого количества классов (или типов, в терминологии .NET), таких как Application, Window, TextBlock, TextBox, Button и многих других. При помощи этих классов мы создадим графическое приложение, в котором будет одно окно с надписью «Hello, WPF!». На этот раз у нас будет два файла с исходным кодом: Program.cs и TestWindow.cs. Ниже приведен их текст.
using System;
using System.Windows;
namespace HelloWpf
{
class Program
{
[STAThread]
public static void Main()
{
Application app = new Application();
app.Run(new TestWindow());
}
}
}
using System;
using System.Windows;
using System.Windows.Controls;
namespace HelloWpf
{
public class TestWindow : Window
{
public TestWindow()
{
Content = new TextBlock()
{
Text = "Hello, WPF!",
FontSize = 32,
HorizontalAlignment = HorizontalAlignment.Center,
VerticalAlignment = VerticalAlignment.Center
};
}
}
}
Компиляция исходного кода
Приложение, которое мы собираемся построить — графическое, а не консольное. И об этом нужно сказать компилятору при помощи ключа /t. Тут надо заметить, что существует несколько видов сборок, которые умеет создавать компилятор C#, и каждому виду соответствует свое значение ключа /t:
Консольное приложение | /t:exe |
---|---|
Графическое приложение | /t:winexe |
Библиотека | /t:library |
Приложение Windows Store | /t:appcontainerexe |
Промежуточный WINMDOBJ-файл | /t:winmdobj |
Модуль | /t:module |
По-умолчанию создаваемое приложение — консольное. Но наше текущее приложение — графическое, поэтому мы указываем ключ /t:winexe.
Типы, которые составляют WPF, находятся в различных библиотеках (в терминологии .NET — сборках):
- WindowsBase.dll
- PresentationCore.dll
- PresentationFramework.dll
И в командной строке компилятора нам нужно сделать на них ссылку при помощи ключа /r. Кроме того, надо сказать компилятору, где он должен искать те сборки, на которые мы ссылаемся — это делается при помощи ключа /lib. Сборки находятся в папке C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\vX.X.X
, где vX.X.X — версия .NET Framework (у меня это v4.7.1). В итоге командная строка для запуска компилятора будет такова:
Ясно, что командная строка уже стала непомерно большой. К счастью в компиляторе CSC есть средство для уменьшения ее длины — это так называемый response file — текстовый файл, который содержит ключи командной строки компилятора. Создадим файл response.rsp со следующим текстом:
# To use this file you need specify its name in CSC command-line like this: csc @filename <other command-line args>
# This specifies the path to referenced assemblies
/lib:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1"
# Reference assemblies
/r:WindowsBase.dll
/r:PresentationCore.dll
/r:PresentationFramework.dll
Символ # служит для комментирования. Я поместил в response-файл не все ключи командной строки, а только те, которые вряд ли изменятся в процессе работы над программой. В командной строке компилятора вы должны указать имя response-файла после символа @. Теперь наша командная строка выглядит вот так:
Строка стала короче, тем не мене писать весь этот длинный путь к файлу csc.exe неудобно. Чтобы облегчить себе жизнь, мы можем написать небольшой командный файл csc.bat следующего содержания:
Символ @
в начале строки означает «не выводить на экран следующую после @ строку» (уберите @, и увидите что будет).
Символы %*
в конце строки означают все аргументы командной строки, переданные командному файлу, кроме 0-го аргумента, который представляет собой путь к командному файлу.
Теперь компиляцию можно запустить через командный файл (мы специально назвали его csc.bat, чтобы всё выглядело так, как будто мы запускаем непосредственно компилятор):
Подробнее о командных файлах Windows читайте Windows Batch Scripting.
Пока всё. В следующей заметке я кратко расскажу о платформе .NET как таковой.