[GUIDE] Ressources developpeurs .NET, VS Code, PowerShell, GitHub
Guide complet des outils, frameworks et bonnes pratiques pour les developpeurs de l’ecosysteme Microsoft. De .NET 9 a GitHub Copilot, en passant par PowerShell et Azure DevOps.
1. .NET & C# — L’ecosysteme moderne
.NET 9 — Nouveautes majeures
.NET 9 (novembre 2024) apporte des ameliorations significatives :
- Performances : amelioration du JIT, du GC (Garbage Collector) et du runtime
- AOT natif : compilation Ahead-of-Time pour les API minimales, applications console et workers
- Serialisation JSON :
System.Text.Jsonameliore avec le support des types supplementaires - LINQ : nouvelles methodes
CountBy,AggregateBy,Index - Bibliotheque de base :
TimeProviderpour les tests temporels,SearchValuespour la recherche optimisee
// Exemple .NET 9 : CountBy et AggregateBy
var mots = new[] { "bonjour", "monde", "bonjour", "france", "monde", "monde" };
foreach (var (mot, count) in mots.CountBy(m => m))
{
Console.WriteLine($"{mot} : {count} fois");
}
ASP.NET Core
| Framework | Usage | Quand l’utiliser |
|---|---|---|
| API minimale | API REST legeres | Microservices, API simples |
| API Controllers | API REST completes | API complexes avec conventions |
| MVC | Sites web avec vues Razor | Applications web traditionnelles |
| Blazor Server | SPA cote serveur | Apps interactives, connexion permanente |
| Blazor WebAssembly | SPA cote client | Apps offline, distribution CDN |
| Blazor United (.NET 8+) | Rendu hybride SSR + interactif | Nouveau standard recommande |
// API minimale .NET 9
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<AppDbContext>();
var app = builder.Build();
app.MapGet("/api/produits", async (AppDbContext db) =>
await db.Produits.ToListAsync());
app.MapPost("/api/produits", async (Produit produit, AppDbContext db) =>
{
db.Produits.Add(produit);
await db.SaveChangesAsync();
return Results.Created($"/api/produits/{produit.Id}", produit);
});
app.Run();
.NET MAUI — Applications cross-platform
.NET MAUI (Multi-platform App UI) permet de creer des applications natives pour Windows, macOS, Android et iOS avec un seul code C# :
// Page MAUI simple
public class MainPage : ContentPage
{
public MainPage()
{
Content = new VerticalStackLayout
{
new Label { Text = "Bienvenue sur MAUI !", FontSize = 24 },
new Button { Text = "Cliquez-moi", Command = new Command(() =>
DisplayAlert("Info", "MAUI fonctionne !", "OK")) }
};
}
}
Entity Framework Core
// Migration EF Core
// 1. Ajouter une migration
// dotnet ef migrations add InitialCreate
// 2. Appliquer a la base de donnees
// dotnet ef database update
public class AppDbContext : DbContext
{
public DbSet<Produit> Produits => Set<Produit>();
public DbSet<Categorie> Categories => Set<Categorie>();
protected override void OnConfiguring(DbContextOptionsBuilder options)
=> options.UseSqlServer("Server=.;Database=MaBase;Trusted_Connection=true;TrustServerCertificate=true;");
}
Migration .NET Framework vers .NET moderne
- Utilisez l’outil upgrade-assistant :
dotnet tool install -g upgrade-assistant
upgrade-assistant upgrade ./MonProjet.sln
- Analysez les incompatibilites avec apiport (API Portability Analyzer)
- Migrez les packages NuGet
System.Webvers les equivalents ASP.NET Core - Remplacez
Web.configparappsettings.json - Convertissez
Global.asaxversProgram.cs/Startup.cs
2. Visual Studio — Productivite maximale
Raccourcis essentiels
| Raccourci | Action |
|---|---|
Ctrl+Maj+B |
Compiler la solution |
F5 / Ctrl+F5 |
Demarrer avec/sans debogage |
Ctrl+. |
Actions rapides et refactoring |
Ctrl+T |
Rechercher fichiers, types, membres |
Ctrl+Maj+F |
Rechercher dans tous les fichiers |
F12 |
Aller a la definition |
Alt+F12 |
Definition en apercu (peek) |
Ctrl+K, Ctrl+D |
Formater le document |
Ctrl+K, Ctrl+C/U |
Commenter/Decommenter |
Ctrl+R, Ctrl+R |
Renommer (refactoring) |
Maj+Alt+Entree |
Plein ecran |
Ctrl+Maj+V |
Historique du presse-papiers |
Extensions indispensables
- ReSharper : analyse de code avancee, refactoring puissant
- CodeMaid : nettoyage et organisation du code
- Fine Code Coverage : couverture de code gratuite
- GitHub Copilot : suggestions IA en temps reel
- Markdown Editor : edition Markdown avec apercu
- SlowCheetah : transformations de fichiers de configuration
Debogage avance
// Breakpoint conditionnel : clic droit sur le breakpoint > Conditions
// Expression : produit.Prix > 100 && produit.Stock == 0
// Point de trace (Tracepoint) : affiche un message sans arreter l'execution
// Message : "Produit {produit.Nom} - Prix: {produit.Prix}"
// DebuggerDisplay pour un affichage personnalise dans le debogueur
[DebuggerDisplay("{Nom} (Id={Id}, Prix={Prix}€)")]
public class Produit
{
public int Id { get; set; }
public string Nom { get; set; }
public decimal Prix { get; set; }
}
- IntelliTrace (Enterprise) : enregistrement de l’historique d’execution pour revenir en arriere dans le debogage
- Profiling : Debogage > Profileur de performances > choisir CPU, memoire, base de donnees
3. VS Code — L’editeur incontournable
Extensions Microsoft recommandees
| Extension | Description |
|---|---|
| C# Dev Kit | IntelliSense, debogage, tests pour C# |
| PowerShell | Edition et debogage PowerShell |
| Azure Tools | Pack complet pour Azure (Functions, App Service, Storage…) |
| GitHub Copilot | Autocompletion IA |
| GitHub Copilot Chat | Chat IA integre dans l’editeur |
| Remote - SSH | Developper sur un serveur distant |
| Remote - WSL | Developper dans WSL |
| Dev Containers | Developper dans des conteneurs Docker |
| Python | Support complet Python |
| Thunder Client | Client REST API integre |
| Live Share | Collaboration en temps reel |
settings.json optimise
{
"editor.fontSize": 14,
"editor.fontFamily": "'Cascadia Code', 'Fira Code', Consolas, monospace",
"editor.fontLigatures": true,
"editor.formatOnSave": true,
"editor.minimap.enabled": false,
"editor.bracketPairColorization.enabled": true,
"editor.guides.bracketPairs": true,
"editor.stickyScroll.enabled": true,
"editor.inlineSuggest.enabled": true,
"terminal.integrated.defaultProfile.windows": "PowerShell",
"terminal.integrated.fontFamily": "'Cascadia Mono', Consolas",
"files.autoSave": "afterDelay",
"files.autoSaveDelay": 1000,
"workbench.colorTheme": "Default Dark Modern",
"git.autofetch": true,
"git.confirmSync": false,
"omnisharp.enableRoslynAnalyzers": true,
"dotnet.defaultSolution": "auto",
"[csharp]": {
"editor.defaultFormatter": "ms-dotnettools.csharp"
},
"[json]": {
"editor.defaultFormatter": "esbenp.prettier-vscode"
}
}
Multi-root Workspaces
Creez un fichier .code-workspace pour regrouper plusieurs projets :
{
"folders": [
{ "path": "./frontend", "name": "Frontend React" },
{ "path": "./backend", "name": "API .NET" },
{ "path": "./shared", "name": "Bibliotheque partagee" }
],
"settings": {
"dotnet.defaultSolution": "backend/MonAPI.sln"
}
}
Remote Development
- SSH :
Ctrl+Maj+P> “Remote-SSH: Connect to Host” — developpez sur un serveur Linux distant - WSL : ouvrez un dossier WSL directement —
code /mnt/c/projets/monappdepuis WSL - Dev Containers : ajoutez un
.devcontainer/devcontainer.jsonpour un environnement reproductible
4. PowerShell — Automatisation et scripts
Scripts d’automatisation courants
# Inventaire des logiciels installes
Get-CimInstance -ClassName Win32_Product |
Select-Object Name, Version, Vendor |
Sort-Object Name |
Export-Csv "$env:USERPROFILE\Desktop\logiciels.csv" -NoTypeInformation -Encoding UTF8
# Nettoyage des fichiers temporaires
$dossiers = @("$env:TEMP", "$env:SystemRoot\Temp", "$env:SystemRoot\Prefetch")
foreach ($dossier in $dossiers) {
Get-ChildItem $dossier -Recurse -Force -ErrorAction SilentlyContinue |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-7) } |
Remove-Item -Force -Recurse -ErrorAction SilentlyContinue
}
Write-Host "Nettoyage termine." -ForegroundColor Green
# Surveillance d'un service avec redemarrage automatique
$service = "Spooler"
if ((Get-Service $service).Status -ne 'Running') {
Start-Service $service
Send-MailMessage -To "[email protected]" -From "[email protected]" `
-Subject "Service $service redemarre" -SmtpServer "smtp.example.com"
}
Modules essentiels
| Module | Usage | Installation |
|---|---|---|
| Az | Gestion Azure | Install-Module Az |
| Microsoft.Graph | API Microsoft 365 | Install-Module Microsoft.Graph |
| ActiveDirectory | Gestion AD DS | Fonctionnalite RSAT |
| ImportExcel | Lire/ecrire Excel sans Office | Install-Module ImportExcel |
| Pester | Tests unitaires PowerShell | Install-Module Pester |
| PSScriptAnalyzer | Linter PowerShell | Install-Module PSScriptAnalyzer |
| Terminal-Icons | Icones dans le terminal | Install-Module Terminal-Icons |
Profil PowerShell
# Editer le profil : notepad $PROFILE
# Contenu recommande :
# Modules
Import-Module Terminal-Icons
Import-Module posh-git
# Alias utiles
Set-Alias -Name g -Value git
Set-Alias -Name k -Value kubectl
Set-Alias -Name tf -Value terraform
# Fonctions personnalisees
function which($name) { Get-Command $name -ErrorAction SilentlyContinue | Select-Object -ExpandProperty Path }
function mkcd($path) { New-Item -ItemType Directory -Path $path -Force; Set-Location $path }
function tail { Get-Content -Tail 20 -Wait @args }
# Prompt personnalise avec Oh My Posh
oh-my-posh init pwsh --config "$env:POSH_THEMES_PATH\paradox.omp.json" | Invoke-Expression
Pester — Tests unitaires
# Fichier : Get-Factorielle.Tests.ps1
Describe "Get-Factorielle" {
It "Retourne 1 pour 0" {
Get-Factorielle -Nombre 0 | Should -Be 1
}
It "Retourne 120 pour 5" {
Get-Factorielle -Nombre 5 | Should -Be 120
}
It "Lance une erreur pour un nombre negatif" {
{ Get-Factorielle -Nombre -1 } | Should -Throw
}
}
# Executer : Invoke-Pester ./Get-Factorielle.Tests.ps1 -Output Detailed
5. GitHub & GitHub Copilot
Git workflow recommande
# Creer une branche feature
git checkout -b feature/ma-fonctionnalite
# Travailler, committer regulierement
git add .
git commit -m "feat: ajout du module d'authentification"
# Pousser et creer une Pull Request
git push -u origin feature/ma-fonctionnalite
gh pr create --title "feat: module authentification" --body "Description detaillee..."
# Apres la revue de code, fusionner
gh pr merge --squash --delete-branch
Conventions de commit (Conventional Commits) :
feat:— nouvelle fonctionnalitefix:— correction de bugdocs:— documentationrefactor:— refactoring sans changement fonctionneltest:— ajout ou modification de testschore:— maintenance (dependances, CI, config)
GitHub Actions — CI/CD
# .github/workflows/dotnet.yml
name: .NET CI/CD
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Setup .NET
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'
- name: Restaurer les dependances
run: dotnet restore
- name: Compiler
run: dotnet build --no-restore --configuration Release
- name: Tests
run: dotnet test --no-build --configuration Release --verbosity normal
--collect:"XPlat Code Coverage"
- name: Publier
if: github.ref == 'refs/heads/main'
run: dotnet publish -c Release -o ./publish
- name: Deployer sur Azure
if: github.ref == 'refs/heads/main'
uses: azure/webapps-deploy@v3
with:
app-name: 'mon-api-production'
publish-profile: ${{ secrets.AZURE_PUBLISH_PROFILE }}
package: ./publish
GitHub Copilot — Prompts efficaces
- Commentaire descriptif : ecrivez un commentaire clair avant le code, Copilot generera l’implementation
- Chat inline :
Ctrl+Ipour demander une modification dans le contexte du fichier - Commandes slash :
/explain— expliquer le code selectionne/fix— corriger un bug/tests— generer des tests unitaires/doc— generer la documentation@workspace— poser une question sur tout le projet
GitHub Codespaces
Environnement de developpement cloud complet base sur VS Code :
- Disponible en quelques secondes depuis n’importe quel depot
- Configuration via
.devcontainer/devcontainer.json - 60 heures/mois gratuites pour les comptes personnels
- Forwarding de ports automatique pour les applications web
6. SQL Server
Requetes d’optimisation essentielles
-- Top 10 des requetes les plus couteuses en CPU
SELECT TOP 10
qs.total_worker_time / qs.execution_count AS avg_cpu_time,
qs.execution_count,
SUBSTRING(qt.text, (qs.statement_start_offset/2) + 1,
((CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.text)
ELSE qs.statement_end_offset END
- qs.statement_start_offset) / 2) + 1) AS query_text
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
ORDER BY avg_cpu_time DESC;
-- Index manquants suggeres par SQL Server
SELECT
d.name AS base_de_donnees,
OBJECT_NAME(mid.object_id, mid.database_id) AS table_name,
mid.equality_columns,
mid.inequality_columns,
mid.included_columns,
migs.avg_user_impact AS amelioration_estimee_pct
FROM sys.dm_db_missing_index_details mid
JOIN sys.dm_db_missing_index_groups mig ON mid.index_handle = mig.index_handle
JOIN sys.dm_db_missing_index_group_stats migs ON mig.index_group_handle = migs.group_handle
JOIN sys.databases d ON mid.database_id = d.database_id
ORDER BY migs.avg_user_impact DESC;
Sauvegarde et restauration
-- Sauvegarde complete
BACKUP DATABASE MaBase TO DISK = 'C:\Backups\MaBase_Full.bak'
WITH COMPRESSION, CHECKSUM, INIT;
-- Restauration
RESTORE DATABASE MaBase FROM DISK = 'C:\Backups\MaBase_Full.bak'
WITH RECOVERY, REPLACE,
MOVE 'MaBase' TO 'C:\Data\MaBase.mdf',
MOVE 'MaBase_Log' TO 'C:\Data\MaBase_log.ldf';
7. Azure DevOps
Pipeline YAML type
# azure-pipelines.yml
trigger:
branches:
include:
- main
- develop
pool:
vmImage: 'windows-latest'
variables:
buildConfiguration: 'Release'
dotnetVersion: '9.0.x'
stages:
- stage: Build
jobs:
- job: BuildAndTest
steps:
- task: UseDotNet@2
inputs:
version: $(dotnetVersion)
- script: dotnet restore
displayName: 'Restaurer les packages'
- script: dotnet build --configuration $(buildConfiguration)
displayName: 'Compiler'
- script: dotnet test --configuration $(buildConfiguration) --logger trx --results-directory $(Agent.TempDirectory)
displayName: 'Executer les tests'
- task: PublishTestResults@2
inputs:
testResultsFormat: 'VSTest'
testResultsFiles: '$(Agent.TempDirectory)/**/*.trx'
- task: PublishBuildArtifacts@1
inputs:
PathtoPublish: '$(Build.ArtifactStagingDirectory)'
ArtifactName: 'drop'
- stage: Deploy
dependsOn: Build
condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))
jobs:
- deployment: DeployProduction
environment: 'production'
strategy:
runOnce:
deploy:
steps:
- script: echo "Deploiement en production..."
displayName: 'Deployer'
Azure DevOps — Composants
| Composant | Description |
|---|---|
| Repos | Depots Git avec Pull Requests et politiques de branche |
| Pipelines | CI/CD avec YAML ou editeur visuel |
| Boards | Gestion de projet Agile (Scrum, Kanban) |
| Artifacts | Flux NuGet, npm, Maven prives |
| Test Plans | Tests manuels et exploratoires |
8. Outils complementaires
NuGet — Gestion des packages
# Ajouter un package
dotnet add package Newtonsoft.Json
dotnet add package Serilog.AspNetCore --version 8.0.0
# Lister les packages obsoletes
dotnet list package --outdated
# Mettre a jour tous les packages
dotnet outdated --upgrade # necessite dotnet-outdated-tool
Docker pour developpeurs .NET
# Dockerfile multi-stage pour une API .NET
FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build
WORKDIR /src
COPY *.csproj ./
RUN dotnet restore
COPY . ./
RUN dotnet publish -c Release -o /app
FROM mcr.microsoft.com/dotnet/aspnet:9.0 AS runtime
WORKDIR /app
COPY --from=build /app ./
EXPOSE 8080
ENTRYPOINT ["dotnet", "MonAPI.dll"]
# Construire et executer
docker build -t mon-api .
docker run -d -p 8080:8080 --name mon-api-container mon-api
Windows Terminal & WSL2
- Installez Windows Terminal depuis le Microsoft Store
- Ajoutez des profils pour PowerShell, CMD, WSL (Ubuntu), Azure Cloud Shell
- WSL2 :
wsl --installpour installer Ubuntu, puiswsl --set-default-version 2 - Interoperabilite : accedez aux fichiers Windows depuis WSL via
/mnt/c/et aux fichiers WSL depuis Windows via\\wsl$\
9. Certifications developpeur Microsoft
| Certification | Sujet | Niveau |
|---|---|---|
| AZ-204 | Developpement de solutions Azure | Associe |
| AZ-400 | Solutions DevOps Azure | Expert |
| MS-600 | Applications et solutions Microsoft 365 | Associe |
| AI-102 | Solutions IA Azure | Associe |
| DP-420 | Azure Cosmos DB | Specialite |
Ressources gratuites :
- Microsoft Learn : parcours d’apprentissage gratuits et interactifs
- .NET Learn : tutoriels debutants a avances
- Microsoft Virtual Training Days : sessions gratuites avec bon d’examen parfois inclus
10. Tableau recapitulatif des commandes
dotnet CLI
dotnet new webapi -n MonAPI # Creer un projet API
dotnet new blazor -n MonApp # Creer un projet Blazor
dotnet run # Executer le projet
dotnet watch # Hot reload en developpement
dotnet build -c Release # Compiler en mode Release
dotnet test # Lancer les tests
dotnet publish -c Release -o ./dist # Publier pour le deploiement
dotnet ef migrations add NomMigration # Creer une migration EF
dotnet ef database update # Appliquer les migrations
dotnet tool install -g dotnet-ef # Installer l'outil EF globalement
Git
git log --oneline --graph -20 # Historique graphique
git stash / git stash pop # Mettre de cote / restaurer
git rebase main # Rebaser sur main
git cherry-pick <hash> # Appliquer un commit specifique
git bisect start # Trouver un commit fautif
git reflog # Historique de toutes les actions
Azure CLI (az)
az login # Se connecter
az group create -n MonRG -l westeurope # Creer un resource group
az webapp create -g MonRG -p MonPlan -n MonApp # Creer une Web App
az webapp deploy -g MonRG -n MonApp --src-path ./dist.zip # Deployer
az acr build --registry MonACR --image monapp:v1 . # Build image
PowerShell (pwsh)
Get-Command *-Service* # Trouver des commandes
Get-Help Get-Process -Examples # Aide avec exemples
Get-Process | Sort-Object CPU -Desc | Select-Object -First 10 # Top CPU
Measure-Command { script.ps1 } # Mesurer le temps d'execution
Test-Connection google.com -Count 4 # Equivalent de ping
Liens utiles : learn.microsoft.com | github.com/dotnet | devblogs.microsoft.com
Pour un accompagnement professionnel : ayinedjimi-consultants.fr