Gå til indholdet

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:

{
  "AppSettings": {
    "Culture": "da-DK",
    "MySetting1": 42,
    "MySetting2": "*"
  }
}

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:

dotnet run
Du skulle se outputtet:
Culture: da-DK
MySetting1: 42
MySetting2: *

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:

dotnet run
Du skulle se outputtet:
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).