En udvidet konsol applikation
Den almindelige C# konsol applikation er ret simpel. Her er en guide til at oprette en mere brugbar applikation med appsettings, log, etc.
Opret et nyt .NET-projekt
Først skal du oprette et nyt .NET-projekt. For eksempel, for at oprette en ny konsolapplikation, kan du bruge følgende kommandoer:
dotnet new console -n MyApp --use-program-main
cd MyApp
dotnet add package Microsoft.Extensions.Configuration
dotnet add package Microsoft.Extensions.Configuration.Json
dotnet add package Microsoft.Extensions.Configuration.Binder
dotnet new class -n AppSettings
Disse kommandoer opretter en ny konsolapplikation i en mappe kaldet “MyApp” med en AppSettings-klasse og nødvendige pakker.
Opret appsettings.json
Opret en appsettings.json
-fil i din projektmappe med følgende indhold:
Tilføj appsettings.json
til dit projekt
Åbn din .csproj
-fil (projektfilen) og tilføj følgende fremhævede linjer for at sikre, at appsettings.json
er inkluderet i dit projekt:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>
Tilret AppSettings-klassen
Ret AppSettings
-klassen så den mapper appsettings.json
:
namespace MyApp;
public class AppSettings
{
public string? Culture { get; set; }
public int MySetting1 { get; set; }
public string? MySetting2 { get; set; }
}
Opdater Program.cs
Opdater din Program.cs
så en instans af AppSettings
bindes til appsettings.json
:
using Microsoft.Extensions.Configuration;
using MyApp;
class Program
{
internal static AppSettings? appSettings;
static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
appSettings = new AppSettings();
configuration.Bind("AppSettings", appSettings);
Thread.CurrentThread.CurrentCulture =
new System.Globalization.CultureInfo(appSettings.Culture??"da-DK");
Console.WriteLine($"MySetting1: {appSettings.MySetting1}");
Console.WriteLine($"MySetting2: {appSettings.MySetting2}");
}
}
using Microsoft.Extensions.Configuration;
using MyApp;
class Program
{
internal static AppSettings? appSettings;
static async Task Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
appSettings = new AppSettings();
configuration.Bind("AppSettings", appSettings);
Thread.CurrentThread.CurrentCulture =
new System.Globalization.CultureInfo(appSettings.Culture??"da-DK");
await Console.Out.WriteLineAsync($"Culture: {appSettings.Culture}");
await Console.Out.WriteLineAsync($"MySetting1: {appSettings.MySetting1}");
await Console.Out.WriteLineAsync($"MySetting2: {appSettings.MySetting2}");
}
}
Kør din applikation
Kør din applikation for at se, hvordan den læser værdien fra appsettings.json
:
Tilføj Serilog
Hvis du ønsker at benytte log i applikationen kan du tilføje Serilog pakkerne:
dotnet add package Serilog
dotnet add package Serilog.Formatting.Compact
dotnet add package Serilog.Settings.Configuration
dotnet add package Serilog.Sinks.Console
dotnet add package Serilog.Sinks.Debug
dotnet add package Serilog.Sinks.File
Tilret appsettings.json
Tilføj følgende til appsettings.json
:
{
"AppSettings": {
"Culture": "da-DK",
"MySetting1": 42,
"MySetting2": "*"
},
"Serilog": {
"Using": [ "Serilog.Sinks.Console", "Serilog.Sinks.File", "Serilog.Sinks.Debug" ],
"MinimumLevel": "Verbose",
"WriteTo": [
{
"Name": "Console",
"Args": {
"outputTemplate": "{Timestamp:HH:mm:ss} {Level:u3} {Message} {NewLine}{Exception}"
}
},
{ "Name": "Debug" },
{
"Name": "File",
"Args": { "path": "logs/mylog.log" }
}
]
}
}
Tilret Program.cs
Tilret Program.cs
for at konfigurere Serilog
.
using Microsoft.Extensions.Configuration;
using MyApp;
using Serilog;
class Program
{
internal static AppSettings? appSettings;
internal static ILogger? logger;
static void Main(string[] args)
{
var configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json", true, true)
.Build();
appSettings = new AppSettings();
configuration.Bind("AppSettings", appSettings);
Thread.CurrentThread.CurrentCulture =
new System.Globalization.CultureInfo(appSettings.Culture??"da-DK");
Log.Logger = new LoggerConfiguration()
.ReadFrom.Configuration(configuration)
.CreateLogger();
logger = Log.Logger;
logger.Information("Information");
logger.Debug("Debug");
logger.Warning("Warning");
logger.Error("Error");
logger.Information($"Culture: {appSettings.Culture}");
logger.Information($"MySetting1: {appSettings.MySetting1}");
logger.Information($"MySetting2: {appSettings.MySetting2}");
}
}
Kør din applikation
Kør din applikation for at se, hvordan den læser værdien fra appsettings.json
:
16:16:00 INF Information
16:16:00 DBG Debug
16:16:00 WRN Warning
16:16:00 ERR Error
16:16:00 INF Culture: da-DK
16:16:00 INF MySetting1: 42
16:16:00 INF MySetting2: *
Hvor tidspunktet naturligvis er din systemtid.
Du burde også kunne finde en log-fil under \MyApp\bin\Debug\net8.0\logs
(.NET version kan være anderledes!) kaldet mylog.log
med samme informationer.
Avanceret brug af VSC til mange projekter
Hvis man arbejde med mange projekter og en solution fil i VSC kan det være lidt teknisk at sætte op - men brug evt dette som skabelon:
- opret en tom folder (feks
c:\temp\vsc-cs-template
) - Kør følgende fra terminal i folderen
dotnet new sln -n MyApp
dotnet new console -n MyProject1
dotnet new console -n MyProject2
dotnet sln add .\MyProject1\MyProject1.csproj
dotnet sln add .\MyProject2\MyProject2.csproj
- Det vil oprette en solution fil (sln), 2 projekter samt binde de to projekter til løsningen
- Tilføj en folder
.vscode
- Tilføj filen
launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": ".NET Core Launch (Active Project)",
"type": "coreclr",
"request": "launch",
"preLaunchTask": "build",
// Brug dynamisk stien til den aktive projekt's DLL-fil
"program": "${workspaceFolder}/${relativeFileDirname}/bin/Debug/net8.0/${relativeFileDirname}.dll",
"args": [],
// Sørg for, at cwd peger på den aktive mappe, hvor den aktuelle fil er placeret
"cwd": "${workspaceFolder}/${relativeFileDirname}",
"console": "internalConsole",
"stopAtEntry": false
}
]}
- Tilføj filen
tasks.json
{
"version": "2.0.0",
"tasks": [
{
"label": "build",
"command": "dotnet",
"type": "process",
"args": [
"build",
"${workspaceFolder}/MyApp.sln",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "publish",
"command": "dotnet",
"type": "process",
"args": [
"publish",
"${workspaceFolder}/MyApp.sln",
"/property:GenerateFullPaths=true",
"/consoleloggerparameters:NoSummary;ForceNoAlign"
],
"problemMatcher": "$msCompile"
},
{
"label": "watch",
"command": "dotnet",
"type": "process",
"args": [
"watch",
"run",
"--project",
"${workspaceFolder}/MyApp.sln"
],
"problemMatcher": "$msCompile"
}
]
}
- Nu burde du kunne redigere en cs-fil i et projekt og benytte debugger (F5).
Spectre
Check iøvrigt Spectre.Console som er en populær pakke til skrive/hente fra konsol samt gøre det nemt at skabe en CLI (Command Line Interface).