Сегодня, дорогие друзья, мы займёмся исключительно странным делом: создадим консольное приложение для 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-приложения могут иметь псевдоним, позволяющий вызывать их из коммандной строки. В файл Package.appxmanifest внутрь узла <Application> добавим несколько колдунских строк, приведя редактируемый фрагмент к следующему виду:
Теперь наше консольное приложение UWP полностью готово, попробуем запустить его как ... настоящее консольное приложение.
За сим откланиваюсь, вопросы по делу приветствуются. Успехов!