Найти в Дзене
Сергин Сергей

Создаём консольное приложение UWP на Visual Basic

Оглавление

Сегодня, дорогие друзья, мы займёмся исключительно странным делом: создадим консольное приложение для Windows 10, используя UWP и Visual Basic. Умоляю не спрашивайте зачем, мне просто было любопытно, вам возможно это зачем-нибудь пригодится.

Если хорошо поискать, то в Маркетплейсе для Visual Studio можно найти шаблоны консольных приложений UWP на C# & С++/CX, но тру-VB-программисты избавлены от соблазна нежиться на перинах готовых решений, нам досталась привилегия ваять всё вот этими ручками.

В статье описан пошаговый рецепт, который гарантированно приведёт к успеху. Нам нужны: актуальные на текущий момент версии Windows 10 Pro и Visual Studio 2019 с установленной ролью Universal Windows Platform development, железные нервы и [не]много внимательности.

Выпиливаем из нового проекта всё, ну почти...

В Visual Studio создаём обычный проект UWP на Visual Basic, выбрав целевую версию SDK поновее (у меня это 18362), минимальную версию не ниже 16299, и начинаем его стричь.

Создаём новый проект
Создаём новый проект

В консольном приложение не нужны файлы описания приложения и главного окна, потому удаляем файлы App.xaml, App.xaml.vb, MainPage.xaml и MainPage.xaml.vb. Теперь нужно добавить модуль Program.vb, в который потом впишем процедуру Main. В итоге наше решение должно выглядеть примерно, как на картинке.

Решение после стрижки
Решение после стрижки

Открываем файл Program.vb, добавляем в модуль процедуру Main, в итоге текст должен выглядеть примерно так:

Открываем свойства проекта, переходим на закладку Compile, выбираем необходимую конфигурацию сборки и платформы (можно выбрать All Configurations и All Platforms), затем внизу жмём на кнопку Advanced Compile Options, в и в строку Custom constants добавляем параметр DISABLE_XAML_GENERATED_MAIN. Обратите внимание, все параметры в поле Custom constants должны быть разделены запятыми, если оставить там точку с запятой, компилятор выдаст ошибку. Добавленный параметр, очевидно, подавляет автогенерирование метода Main, который мы выше добавили вручную.

Внимательность и ещё раз внимательность
Внимательность и ещё раз внимательность

Режем по живому

Дальше начинается совсем хирургия. Нужно заставить наше приложение быть по-настоящему консольным, для этого будем кроить файл Package.appxmanifest прям открытым текстом (текстовое представление доступно через контекстное меню файла по команде View Code).

Сначала в элемент Package добавим два пространства имён: xmlns:uap5="http://schemas.microsoft.com/appx/manifest/uap/windows10/5" и xmlns:desktop4="http://schemas.microsoft.com/appx/manifest/desktop/windows10/4", итог должен выглядеть так:

Затем нужно явно указать, что наше приложение - консольное, задать точку входа и ещё кое-что. Добавляем и редактируем несколько строк в элементе Application, приводя его к показанному ниже виду. Параметр EntryPoint показывает в каком модуле искать процедуру Main, остальное очевидно.

На этом обязательная программа завершена. Компилируем, запускаем, работает! С этого момента в нашем распоряжении вся мощь .NET и UWP в консольном режиме. Правда окошко появляется на мгновение и исчезает, давайте попробуем превратить приложение во что-нибудь минимально полезное. Превратим процедуру Main примерно в это.

Для проверки наваянного кода в свойствах проекта на закладке Debug вводим несколько параметров в поле Command line arguments, запускаем и видим то, к чему так старательно шли.

Консольное приложение UWP с параметрами
Консольное приложение UWP с параметрами

Погодите, это ещё не всё

UWP-приложения могут иметь псевдоним, позволяющий вызывать их из коммандной строки. В файл Package.appxmanifest внутрь узла <Application> добавим несколько колдунских строк, приведя редактируемый фрагмент к следующему виду:

Теперь наше консольное приложение UWP полностью готово, попробуем запустить его как ... настоящее консольное приложение.

Запускаем и получаем
Запускаем и получаем

За сим откланиваюсь, вопросы по делу приветствуются. Успехов!