« Application console » : différence entre les versions
De Banane Atomic
Aller à la navigationAller à la recherche
Aucun résumé des modifications |
|||
(35 versions intermédiaires par le même utilisateur non affichées) | |||
Ligne 2 : | Ligne 2 : | ||
[[Category:VisualStudio]] | [[Category:VisualStudio]] | ||
= Liens = | = Liens = | ||
* [[Command_Line_Parser_Library]] | * [[Spectre.Console]] | ||
* [[Command_Line_Parser_Library|Command Line Parser Library]] | |||
* [[CSharp_7.1#Async_Main|Async Main]] | |||
= Code = | = Code = | ||
Ligne 92 : | Ligne 94 : | ||
Console.ResetColor(); | Console.ResetColor(); | ||
</kode> | </kode> | ||
= [https://andrewlock.net/using-dependency-injection-in-a-net-core-console-application/ Dependency injection] = | |||
<kode lang='bash'> | |||
dotnet add package Microsoft.Extensions.Hosting | |||
</kode> | |||
<filebox fn='Program.cs'> | |||
var appBuilder = Host.CreateApplicationBuilder(args); | |||
appBuilder.Services.AddSingleton<MyService>(); | |||
var host = appBuilder.Build(); | |||
var myService = host.Services.GetService<MyService>() ?? throw new NullReferenceException("MyService service"); | |||
</filebox> | |||
== [[Asp.net_core_7#Log|Logging in .Net Core Console Apps]] == | |||
* [[Serilog]] | |||
<kode lang='bash'> | |||
dotnet add package Microsoft.Extensions.Logging.Console | |||
</kode> | |||
<filebox fn='Program.cs'> | |||
var appBuilder = Host.CreateApplicationBuilder(args); | |||
appBuilder.Logging | |||
.ClearProviders() | |||
.AddConsole(); | |||
var host = hostBuilder.Build(); | |||
var logger = host.Services.GetService<ILoggerFactory>()?.CreateLogger<Program>() ?? throw new NullReferenceException("ILoggerFactory service"); | |||
logger.LogDebug("Starting application"); | |||
</filebox> | |||
<filebox fn='MyService.cs'> | |||
private readonly ILogger logger; | |||
public MyService(ILogger logger) | |||
{ | |||
this.logger = logger; | |||
} | |||
</filebox> | |||
== Configuration == | |||
<filebox fn='Program.cs'> | |||
var appBuilder = Host.CreateApplicationBuilder(args); | |||
// by default the app load appsettings.json from Directory.GetCurrentDirectory() | |||
// change to load from the directory where the binary is located | |||
var appBuilder = new HostApplicationBuilder( | |||
new HostApplicationBuilderSettings { ContentRootPath = AppContext.BaseDirectory }); | |||
var host = hostBuilder.Build(); | |||
</filebox> | |||
<filebox fn='MyService.cs'> | |||
private readonly IConfiguration configuration; | |||
public MyService(IConfiguration configuration) | |||
{ | |||
this.configuration = configuration; | |||
} | |||
var value = configuration.GetValue<string>("key"); | |||
var values = Configuration.GetSection("sectionKey").Get<string[]>(); | |||
</filebox> | |||
{{warn | By default the environment is set to Production, so the user secrets storage is not loaded.}} | |||
= [[Asp.net_core_7#Configuration|Configuration]] = | |||
<kode lang='bash'> | |||
dotnet add package Microsoft.Extensions.Configuration.Json | |||
dotnet add package Microsoft.Extensions.Configuration.Binder | |||
</kode> | |||
<filebox fn='Program.cs'> | |||
private static IConfiguration Configuration; | |||
static void Main(string[] args) | |||
{ | |||
var builder = new ConfigurationBuilder() | |||
.SetBasePath(AppContext.BaseDirectory) // default value | |||
.AddJsonFile("appsettings.json"); | |||
Configuration = builder.Build(); | |||
var value1 = Configuration.GetValue<string>("section1"); | |||
var value2 = Configuration.GetValue<int>("section2"); | |||
var values = Configuration.GetSection("section3").Get<string[]>(); | |||
</filebox> | |||
<filebox fn='MyProject.csproj' lang='xml'> | |||
<!-- copy the appsettings.json file in the output folder --> | |||
<ItemGroup> | |||
<None Include="appsettings.json" CopyToOutputDirectory="PreserveNewest" /> | |||
</ItemGroup> | |||
</filebox> | |||
= Entity Framework Core = | |||
<filebox fn='Program.cs'> | |||
// nuget package: Microsoft.Extensions.Hosting | |||
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); // allow to use scaffold with a named connection string | |||
var connectionString = builder.Configuration.GetConnectionString("DB1"); | |||
var serverVersion = new MariaDbServerVersion(new Version(11, 0, 2)); | |||
builder.Services.AddDbContext<DB1Context>( | |||
dbContextOptions => dbContextOptions | |||
.UseMySql(connectionString, serverVersion) | |||
// TODO The following three options help with debugging, but should be changed or removed for production. | |||
.LogTo(Console.WriteLine, LogLevel.Information) | |||
.EnableSensitiveDataLogging() | |||
.EnableDetailedErrors()); | |||
builder.Services.AddTransient<ItemRepository>(); | |||
using IHost host = builder.Build(); | |||
var itemRepository = host.Services.GetService<ItemRepository>(); | |||
if (itemRepository is not null) | |||
{ | |||
await itemRepository.GetAllItemsAsync(); | |||
} | |||
//await host.RunAsync(); | |||
</filebox> |
Dernière version du 24 mars 2024 à 15:58
Liens
Code
using System; namespace MonNS { class MaClasse { public static void Main(string[] args) { Console.WriteLine(""); } } } |
Read input
ConsoleKeyInfo keyInfo = Console.ReadKey(true); if (keyInfo.Key == ConsoleKey.Escape) { } |
Masquer la saisie d'un mot de passe
public static string ReadPassword() { string password = ""; ConsoleKeyInfo info = Console.ReadKey(true); while (info.Key != ConsoleKey.Enter) { if (info.Key != ConsoleKey.Backspace) { Console.Write("*"); password += info.KeyChar; } else if (info.Key == ConsoleKey.Backspace) { if (!string.IsNullOrEmpty(password)) { // remove one character from the list of password characters password = password.Substring(0, password.Length - 1); // get the location of the cursor int pos = Console.CursorLeft; // move the cursor to the left by one character Console.SetCursorPosition(pos - 1, Console.CursorTop); // replace it with space Console.Write(" "); // move the cursor to the left by one character again Console.SetCursorPosition(pos - 1, Console.CursorTop); } } info = Console.ReadKey(true); } // add a new line because user pressed enter at the end of their password Console.WriteLine(); return password; } |
Masquer la fenêtre de la Console
[DllImport("kernel32.dll")] private static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); private const int SW_HIDE = 0; private const int SW_SHOW = 5; var handle = GetConsoleWindow(); ShowWindow(handle, SW_HIDE); |
Couleurs
Console.BackgroundColor = ConsoleColor.DarkRed; Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("..."); Console.ResetColor(); |
Dependency injection
dotnet add package Microsoft.Extensions.Hosting |
Program.cs |
var appBuilder = Host.CreateApplicationBuilder(args); appBuilder.Services.AddSingleton<MyService>(); var host = appBuilder.Build(); var myService = host.Services.GetService<MyService>() ?? throw new NullReferenceException("MyService service"); |
Logging in .Net Core Console Apps
dotnet add package Microsoft.Extensions.Logging.Console |
Program.cs |
var appBuilder = Host.CreateApplicationBuilder(args); appBuilder.Logging .ClearProviders() .AddConsole(); var host = hostBuilder.Build(); var logger = host.Services.GetService<ILoggerFactory>()?.CreateLogger<Program>() ?? throw new NullReferenceException("ILoggerFactory service"); logger.LogDebug("Starting application"); |
MyService.cs |
private readonly ILogger logger; public MyService(ILogger logger) { this.logger = logger; } |
Configuration
Program.cs |
var appBuilder = Host.CreateApplicationBuilder(args); // by default the app load appsettings.json from Directory.GetCurrentDirectory() // change to load from the directory where the binary is located var appBuilder = new HostApplicationBuilder( new HostApplicationBuilderSettings { ContentRootPath = AppContext.BaseDirectory }); var host = hostBuilder.Build(); |
MyService.cs |
private readonly IConfiguration configuration; public MyService(IConfiguration configuration) { this.configuration = configuration; } var value = configuration.GetValue<string>("key"); var values = Configuration.GetSection("sectionKey").Get<string[]>(); |
By default the environment is set to Production, so the user secrets storage is not loaded. |
Configuration
dotnet add package Microsoft.Extensions.Configuration.Json dotnet add package Microsoft.Extensions.Configuration.Binder |
Program.cs |
private static IConfiguration Configuration; static void Main(string[] args) { var builder = new ConfigurationBuilder() .SetBasePath(AppContext.BaseDirectory) // default value .AddJsonFile("appsettings.json"); Configuration = builder.Build(); var value1 = Configuration.GetValue<string>("section1"); var value2 = Configuration.GetValue<int>("section2"); var values = Configuration.GetSection("section3").Get<string[]>(); |
MyProject.csproj |
<!-- copy the appsettings.json file in the output folder --> <ItemGroup> <None Include="appsettings.json" CopyToOutputDirectory="PreserveNewest" /> </ItemGroup> |
Entity Framework Core
Program.cs |
// nuget package: Microsoft.Extensions.Hosting HostApplicationBuilder builder = Host.CreateApplicationBuilder(args); // allow to use scaffold with a named connection string var connectionString = builder.Configuration.GetConnectionString("DB1"); var serverVersion = new MariaDbServerVersion(new Version(11, 0, 2)); builder.Services.AddDbContext<DB1Context>( dbContextOptions => dbContextOptions .UseMySql(connectionString, serverVersion) // TODO The following three options help with debugging, but should be changed or removed for production. .LogTo(Console.WriteLine, LogLevel.Information) .EnableSensitiveDataLogging() .EnableDetailedErrors()); builder.Services.AddTransient<ItemRepository>(); using IHost host = builder.Build(); var itemRepository = host.Services.GetService<ItemRepository>(); if (itemRepository is not null) { await itemRepository.GetAllItemsAsync(); } //await host.RunAsync(); |