.NET/C# для начинающих (Часть 1 — HelloWorld)

В этой заметке я расскажу, как построить две очень простые программы на платформе .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:

mkdir HelloWorld

В папке HelloWorld создайте файл Program.cs:

cd HelloWorld
touch Program.cs

Теперь откроем файл Program.cs блокнотом:

notepad Program.cs

и введем следующий код:

using System; // import System namespace

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:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc /out:HelloWorld.exe Program.cs

Также можно скомпилировать исходный код компилятором Roslyn (если у вас установлена Visual Studio) — далее я буду пользоваться именно им:

"C:\Program Files\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csc" /out:HelloWorld.exe Program.cs

Обратите внимание на двойные кавычки в пути к компилятору — они необходимы, так как путь содержит пробелы.
Теперь в папке HelloWorld появился файл HelloWorld.exe, который мы можем запустить:

> 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. Ниже приведен их текст.

// Program.cs

using System;
using System.Windows;

namespace HelloWpf
{
    class Program
    {
        [STAThread]
        public static void Main()
        {
            Application app = new Application();
            app.Run(new TestWindow());
        }
    }
}
// TestWindow.cs

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). В итоге командная строка для запуска компилятора будет такова:

"C:\Program Files\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csc" /lib:"C:\Program Files\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.7.1" /r:WindowsBase.dll /r:PresentationCore.dll /r:PresentationFramework.dll /t:winexe /out:HelloWPF.exe TestWindow.cs Program.cs

Ясно, что командная строка уже стала непомерно большой. К счастью в компиляторе CSC есть средство для уменьшения ее длины — это так называемый response file — текстовый файл, который содержит ключи командной строки компилятора. Создадим файл response.rsp со следующим текстом:

# This file contains command-line options for C# compiler (CSC).
# 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-файла после символа @. Теперь наша командная строка выглядит вот так:

"C:\Program Files\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csc" @response.rsp /t:winexe /out:HelloWPF.exe TestWindow.cs Program.cs

Строка стала короче, тем не мене писать весь этот длинный путь к файлу csc.exe неудобно. Чтобы облегчить себе жизнь, мы можем написать небольшой командный файл csc.bat следующего содержания:

@"C:\Program Files\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csc" %*

Символ @ в начале строки означает «не выводить на экран следующую после @ строку» (уберите @, и увидите что будет).
Символы %* в конце строки означают все аргументы командной строки, переданные командному файлу, кроме 0-го аргумента, который представляет собой путь к командному файлу.
Теперь компиляцию можно запустить через командный файл (мы специально назвали его csc.bat, чтобы всё выглядело так, как будто мы запускаем непосредственно компилятор):

csc @response.rsp /t:winexe /out:HelloWPF.exe TestWindow.cs Program.cs

Подробнее о командных файлах Windows читайте Windows Batch Scripting.

Пока всё. В следующей заметке я кратко расскажу о платформе .NET как таковой.

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

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