Файл не был создан консольным приложением

Обновлено: 21.11.2024

Вместо этого мы можем управлять консольными приложениями, просто переходя прямо к интересующим нас классам и размещая там хуки. Это то, что мы сделали, когда хотели управлять выводом текста на экран: мы просто перешли к WriteLine в CLR и к println в JVM и поместили наш код там. В общем, управление консольными приложениями основано на характеристиках объектно-ориентированного языка более низкого уровня, таких как наследование, полиморфизм, делегирование и базовые классы, о которых мы поговорим в главе 8.

Механизм использования интерпретаторов Tcl и Tk

2.2.2 Консоль Tk ( tkcon ) — альтернативная интерактивная оболочка tclsh/wish

Джеффри Хоббс написал полезную консольную программу tkcon , которая обеспечивает более приятный интерфейс, чем простое приглашение %. Облегченная версия программы является консолью по умолчанию, когда вы запускаете tclsh или желаете в MS Windows.

Вы можете запустить tkcon в системах Mac OS/X и Linux/Unix, как и любой другой скрипт Tcl/Tk. Эта программа размещена на сопутствующем веб-сайте.

Приложение tkcon предоставляет следующие возможности:

Механизм истории на основе меню, облегчающий поиск и повторение предыдущих команд.

Похожий на Emacs интерфейс редактора для командной строки, позволяющий легко исправлять опечатки или слегка изменять предыдущие команды.

Сопоставление скобок и скобок, чтобы ваш код оставался упорядоченным.

Текст с цветовой кодировкой для различения команд, данных, комментариев и т. д.

Возможность сохранять ваши команды в файл. Это позволяет вам экспериментировать с командами и сохранять вашу работу.

Пункт меню для загрузки и запуска командных сценариев Tcl из файлов.

Поддержка открытия нескольких новых дисплеев tkcon.

Обратите внимание, что хотя tkcon поддерживает отладку сценариев Tcl/Tk, с ним проще работать, чем с интерактивным интерпретатором желаний, его можно использовать для вызова сценариев желаний, и он более мощный, чем интерпретатор команд Windows, tkcon не справляется с этой задачей. с программами, использующими стандартный ввод для чтения пользовательского ввода. Он предназначен для помощи в разработке сценариев Tcl и для выполнения неинтерактивных или ориентированных на графический интерфейс исполняемых файлов, а не в качестве замены консоли DOS или окна xterm.

Создание доски сообщений с помощью ADO и XML

Проектирование класса User

Существует четыре основных типа пользователей: гости, зарегистрированные пользователи, администраторы и модераторы. Все это должно быть представлено, когда мы создаем наш класс User. Опять же, вы можете сказать что-то вроде «но это объектно-ориентированное приложение, и если у нас есть несколько типов одного объекта, разве они не должны быть отдельными?» Опять же, вы были бы правы. Есть три типа пользователей. Все они имеют схожие свойства; единственная разница в том, что некоторые делают определенные вещи, которые другие не могут. Например, зарегистрированный пользователь на доске объявлений будет иметь возможность публиковать темы и сообщения, а гость - нет. Зарегистрированный пользователь также будет иметь возможность редактировать свой профиль и свои сообщения, в то время как гостевой пользователь не сможет этого сделать. Администратор будет иметь возможность делать все, что может зарегистрированный пользователь, за исключением глобального. Модератор может изменять сообщения и обсуждения на форумах, на которые у него есть права модератора.

Теперь, когда мы определили несколько типов пользователей, нам нужно определить, должны ли мы иметь несколько типов пользователей в нашем приложении. Гость может просматривать только доску объявлений, так как для просмотра не требуется никаких мер безопасности. Зарегистрированный пользователь может создавать и редактировать сообщения, а также изменять свой профиль. Администратор может делать с доской объявлений все, что захочет. Модератор может делать то же, что и зарегистрированный пользователь, и может действовать как администратор на доске, на которую ему или ей предоставлены права модерации.

Возможно, вы захотите создать здесь несколько изящных объектно-ориентированных объектов, но все это можно выполнить с помощью одного класса User. Взгляните на рис. 13.9.

Рисунок 13.9. Диаграмма объектов Пользователь

Вы видите, что наш объект Пользователь будет иметь те же поля, что и наша таблица базы данных, которая называется точно так же. Это немного облегчает запоминание того, какое поле в объекте соответствует какому полю в базе данных. Еще одна вещь, на которую следует обратить внимание, — это три элемента в нижней части диаграммы: Создать, Проверить и Обновить. Все это методы объекта User. Update() обновит данные пользователя и сохранит их в базе данных. Validate — это общий метод класса User, который может использоваться для выполнения всех проверок пользователей. Create также является общим методом и может использоваться для создания нового пользователя в базе данных.

Вот и все. Это весь объект User. Не так уж и много?У него есть логическое поле, указывающее, является ли он администратором, и каждый объект Доски будет хранить идентификатор администратора этой Доски, поэтому объекту Пользователь это не нужно. Единственное, что еще следует упомянуть, это гостевые пользователи — гостевой пользователь будет просто Пользователем, который Ничего не значит. То есть, если вы в настоящее время являетесь гостем в приложении, для вас не будет создан объект Пользователь. Давайте взглянем на код, используемый для создания этого объекта User на рис. 13.10 (который также можно найти на компакт-диске с именем User.vb).

Рисунок 13.10. Основы (User.vb)

Эта часть достаточно ясна. Мы объявляем класс User и частные переменные, необходимые для представления каждого пользователя. Затем объявите общедоступные свойства для каждой из этих частных переменных, как показано на рис. 13.11.

Мы уже рассмотрели много статей об универсальном хосте. Хост — это концепция, инкапсулирующая внедрение зависимостей, конфигурацию, ведение журнала и реализации IHostedService.

Если вы прочитали все предыдущие статьи, эта статья может показаться очень очевидной. Я подумал, что было бы неплохо продемонстрировать, как настроить хост в консольном приложении, чтобы консольное приложение могло использовать файл конфигурации appsettings.json.

Создать консольное приложение

Создайте консольное приложение с помощью командной строки dotnet или Visual Studio. После создания приложения добавьте ссылку на пакет nuget Microsoft.Extensions.Hosting. Этот пакет предоставит все необходимое

Добавить JSON-файл

Добавьте файл json appsettings.json в проект консольного приложения. Обратите внимание, что мы не вносили никаких изменений в код, поэтому файл еще не читается.

После добавления файла щелкните правой кнопкой мыши appsettings.json и выберите свойства. Затем установите для параметра «Копировать в выходной каталог» значение «Копировать всегда».

Добавьте несколько настроек в файл json, чтобы убедиться, что эти настройки загружены.

Настройка хоста

Теперь измените основной метод, чтобы создать построитель узлов, а затем запустите его. Код приведен ниже.

Код сначала создает построитель узлов, а затем применяет конфигурации приложения. Параметр метода ConfigureAppConfiguration, делегат Action, указывает хосту загрузить конфигурации из appsettings.json .

Приведенный ниже код не загружает никаких настроек из переменных среды или из командной строки, но приведенный ниже пример можно легко настроить в соответствии с требованиями приложения.

Пример рабочего

Это просто демонстрационный класс, в который вводится IConfiguration. Затем в методе DoWork мы распечатаем все значения конфигурации, загруженные в приложение.

Ниже в коде показаны файлы Program.cs и Worker.cs.

Теперь, когда вы запускаете код, вы должны увидеть все пары значений ключа конфигурации, загруженные в приложение.

  • Поддержка структурированного ведения журналов, что позволяет обрабатывать журналы как наборы данных, а не как текст.
  • Совместимость с асинхронными приложениями и системами.
  • Множественные цели ведения журнала, такие как файлы, консоль, электронная почта и многие другие выходные данные. , который помогает сериализовать объекты с помощью оператора @

Serilog полезен как в самых простых небольших приложениях, так и в больших и сложных. Благодаря богатым возможностям настройки вы можете использовать его во всех своих проектах.

В этом уроке вы узнаете, как:

Предпосылки

  • Установлена ​​Windows 10.
  • Visual Studio установлена.

Шаг 1 — Создание проекта

Для начала вам необходимо создать новый проект. В Visual Studio это можно сделать несколькими способами. Первый — выбрать «Создать новый проект» в стартовом окне Visual Studio.

Если интегрированная среда разработки Visual Studio уже открыта, вы можете пройти по пути в верхней строке меню *Файл > Создать > Проект * и таким образом создать новый проект.

Последний способ — использовать сочетание клавиш: Ctrl + Shift + N .

Шаг 2 — Установка зависимостей

Прежде чем приступить к работе с приложением, необходимо установить некоторые пакеты зависимостей. Visual Studio предоставляет несколько способов использования диспетчера пакетов NuGet. В этом руководстве мы будем использовать консоль диспетчера пакетов.

Первое, что вам нужно сделать, это открыть консоль диспетчера пакетов. Вы можете сделать это, используя Инструменты > Диспетчер пакетов NuGet > Консоль диспетчера пакетов. Кроме того, вы можете последовательно нажимать ALT , V , E и O .

В открывшейся консоли последовательно выполните следующие команды.

Шаг 3 — Создание регистратора

Теперь вы готовы создать регистратор с базовой конфигурацией.

Для приложения мы будем использовать систему уровней Serilog. Система состоит из 6 уровней:

  • Неустранимая – используется для сообщения об ошибках, приводящих к закрытию приложения.
  • Ошибка — используется для регистрации серьезных проблем, возникших во время выполнения программы.
  • Предупреждение — используется для сообщения о некритическом необычном поведении.
  • Информация — используется для информационных сообщений, освещающих ход выполнения приложения для системного администратора и конечного пользователя.
  • Отладка — используется для отладки сообщений с расширенной информацией об обработке приложения.
  • Подробный — самый зашумленный уровень, используемый для трассировки кода.

Уровень по умолчанию, если не указан минимальный уровень, является уровнем информации.

Создать регистратор в Serilog довольно просто. Вы можете получить работающий регистратор в несколько строк.

Следующий код должен быть записан в файл Program.cs:

Шаг 4 — Настройка регистратора

Serilog имеет широкие возможности настройки и предоставляет два способа настройки регистратора: программно или с помощью файла конфигурации. Подробную информацию о каждом из них вы можете получить в документации.

В этом руководстве мы настроим регистратор программно. Мы решили добавить 2 дополнительные цели ведения журнала для приложения.

Первая цель ведения журнала — это файл для предупреждений и журналов с более высоким уровнем серьезности, структурированный в формате JSON. Serilog имеет встроенный модуль форматирования JSON, который мы собираемся использовать в регистраторе.

Вторая цель ведения журнала — это скользящий файл для всех журналов. Прокручивающийся файл — это файл, используемый в течение определенного периода времени. По истечении интервала прокатки программа автоматически создаст новый файл с отметкой даты создания в имени.

Шаг 5 — Создание дополнительных классов

Первый файл будет содержать класс Person. Вы можете увидеть его код во фрагменте ниже.

Второй файл будет содержать класс Car. Вы можете увидеть его код во фрагменте ниже.

Кроме того, если вы хотите уменьшить количество байтов событий журнала, вы можете предпочесть CompactJsonFormatter вместо стандартного JsonFormatter Serilog.

Шаг 6 — Ведение журнала

Чтобы продемонстрировать, как работает регистратор, мы запишем несколько простых сообщений.

Теперь давайте создадим и запустим программу. Вы можете просто сделать это, нажав CTRL + F5 .

После выполнения вывод вашей консоли должен выглядеть следующим образом:

Теперь давайте проверим журналы, записанные в файлы. Файлы находятся в той же папке, что и ваш исполняемый файл. В нашем случае это C:\\Users\\username\\source\\repos\\SerilogAdvanced\\SerilogAdvanced\\bin\\Debug\\netcoreapp3.1 .

Во-первых, ваш файл Important.json должен выглядеть следующим образом.

Во-вторых, файл для всех журналов будет содержать текущую дату. В нашем случае это all-20210507.logs.

Заключение

Правильное ведение журнала может значительно помочь в поддержке и разработке вашего приложения. Это может показаться сложной задачей, но Serilog — это быстрая и настраиваемая среда ведения журналов, которая значительно упрощает задачу.

Укажите место на вашем компьютере и дайте проекту имя, в данном случае CS447.

Перейдите на вкладку "Настройки приложения".

Убедитесь, что консольное приложение и пустой проект выбраны.

Шаг 2. Добавьте новый исходный файл

Обозреватель решений показывает дерево, представляющее ваше текущее решение. Решения состоят из одного или нескольких проектов, которые, в свою очередь, состоят из одного или нескольких файлов. В настоящее время в нашем решении есть один проект, а именно CS447 .

Щелкните правой кнопкой мыши наш проект CS447 в обозревателе решений и выберите "Добавить->Новый элемент".

Нам нужен исходный файл C++, поэтому выберите категорию «Код» и файл C++ (.cpp) из доступных шаблонов.

Введите имя исходного файла, в нашем случае main.cpp. Местоположение уже должно быть в проекте, который вы создали.

Теперь в редакторе должен появиться пустой исходный файл с именем main.cpp .

Шаг 3. Добавьте код

Теперь мы готовы добавить в нашу программу реальный код. Введите (или вырежьте и вставьте) следующий код в файл main.cpp, который уже должен быть открыт в главном окне исходного кода.

с использованием пространства имен std;

Я не буду объяснять этот код, поскольку ожидается, что вы будете иметь представление о C++ для этого (и всех будущих) руководств.

Наш проект очень прост. В настоящее время у нас есть только одна функция, поэтому легко найти нужный код. Однако проекты для CS 447 могут стать довольно большими, и найти ту функцию, которую вы хотите изменить, может быть не так просто. Давайте взглянем на другое окно VS08, которое может нам помочь. Выберите View -> Class View, чтобы открыть окно Class View. Это окно похоже на обозреватель решений, поэтому вы, вероятно, захотите разместить их вместе.В этом окне наш проект отображается в виде дерева. Однако окно Class View разбивает проект по классам и функциям, а не по файлам. Прямо сейчас у нас есть только одна основная функция, но позже ваши проекты будут разрастаться до множества классов, каждый из которых будет содержать множество функций. Окно Class View окажется неоценимым при навигации по таким проектам позже в курсе.

Шаг 4. Создание проекта

Теперь мы готовы скомпилировать и скомпоновать нашу программу. Visual Studio называет этот процесс сборкой. Перед сборкой нашего проекта нам нужно открыть другое окно, чтобы мы могли увидеть результаты нашей попытки сборки. Выберите View -> Output в меню VS08. Окно вывода показывает результат процесса компиляции и компоновки. Не стесняйтесь закрепить или скрыть это окно, так как оно нам понадобится довольно редко.

Выберите «Сборка» -> «Сборка решения» в меню VS08. Это должно привести к тому, что некоторый текст будет помещен в окно вывода. Если вы правильно скопировали приведенный выше код, вы должны увидеть следующий вывод справа. Если сборка не удалась, вы должны увидеть текст, объясняющий, почему она не удалась. Если ошибка является ошибкой компиляции, вы сможете дважды щелкнуть по ошибке, и окно исходного кода должно обновиться, чтобы показать вам строку, в которой произошла ошибка. На данный момент у нас не должно быть ошибок, значит, мы успешно построили наш проект и готовы его запустить.

Довольно понятно:

  • Опубликовать проект из текущего каталога
  • Создайте проект для работы на 64-разрядных компьютерах с Windows
  • Сборка в режиме конфигурации выпуска.
  • Публиковать все как «автономное», чтобы все необходимое для запуска приложения было упаковано с нашим исполняемым файлом.

Так что это работает правильно, мы получаем папку с нашим exe и всем, что требуется для его запуска, но проблема в том, что для запуска даже консольного приложения HelloWorld требуется тонна.

Так что функционально это работает. Но с точки зрения оптики это выглядит как беспорядок. Я отправлял такие папки клиентам и должен был сказать: «Ухх… Итак, я собираюсь отправить вам папку с сотнями файлов в ней… Но… Можете ли вы просто найти файл с названием MyApplication.exe и запустить его и не беспокойтесь об остальном?». Когда люди привыкли иметь значок на своем рабочем столе, они дважды щелкают, и все просто... работает... Это просто не работает.

Флаг PublishSingleFile

Все это вступление буквально сводится к одному флагу команды:

Все, что он делает, это запускает нашу команду публикации, но приказывает ей упаковать ее в один файл. Вы заметите, что мы больше не указываем автономный флаг. Это потому, что предполагается, что если вы упаковываете как один исполняемый файл, вам понадобятся все его зависимости вместе с ним. Имеет смысл.

Один аккуратный exe! Когда это выполняется, зависимости извлекаются во временный каталог, а затем все запускается оттуда. По сути, это архив нашей предыдущей папки публикации! У меня было несколько игр с ним, и, честно говоря, он просто работает. Больше нечего сказать об этом. Это просто работает.

Полезный совет. Убедитесь, что вы очистили каталог публикации или просто полностью удалили папку bin. Это ничего не сломает, если вы этого не сделаете, но все эти старые библиотеки DLL просто висят вокруг, пока вы не сделаете это, так что ваш единственный EXE-файл будет трудно обнаружить.

Размер файла и стоимость запуска

Еще одна проблема, с которой вы можете столкнуться, заключается в том, что при первом запуске автономного исполняемого файла возникают небольшие затраты на запуск. Поскольку при первом запуске необходимо распаковать все зависимости во временный каталог, это займет немного времени. Это не безумие (5 секунд или около того), но заметно. К счастью, при последующих запусках он использует эту уже разархивированную временную папку, поэтому запуск выполняется немедленно.

Читайте также: