.NET itself, rather than anything you build on it: the SDK, the command line, the container, the compiler, the debugger and the profiler.
It is the material that is easy to never learn, because you can ship for years without knowing how service lifetimes resolve or what the CLI does when it restores. It is also the material that decides how long the awkward days last.
Start anywhere. Nothing here depends on anything else here.
What .NET Is
The naming has changed more than once, so this is the short version of which thing is which.
- Differences Between .NET Framework, .NET Core, and .NET Standard
- What is .NET – Why Should We Use It, and What Can We Do With It
- How to Check if .NET Is Already Installed
The SDK, the CLI and the Project File
Building, running and publishing from the command line, and the project settings that control it.
- Build vs Publish in Visual Studio
- Targeting Multiple Frameworks in a .NET Project
- Building Distributed Applications With .NET Aspire
- Central Package Management for .NET Projects
- Using the CLI to Build and Run .NET Applications
- How to Switch Between .NET SDK Versions
- How To Set Up SSL Certificate In Visual Studio and .NET CLI
- Using dotnet format Command to Format the C#/.NET Code
- Creating .NET Project Templates
Dependency Injection
The container ships with the platform, so most questions here are about lifetimes and about the error message you get when one is wrong.
- .NET Dependency Injection With Constructor Parameters
- Dependency Injection With Simple Injector
- Dynamically Change the ServiceLifetime of a Registered Service
- How to Solve Unable to Resolve Service for a Type
- How to Get an Instance of IServiceProvider
- How to Use Factory Pattern With Dependency Injection
- How to Conditionally Resolve Dependencies
- How to Mock IOptions
- How to Resolve IOptions Instance Inside Program Class
Reflection, Attributes and Source Generators
Reading and generating types at runtime and at compile time, and when the compile-time version is the better answer.
- Custom Attributes
- Differences Between ExpandoObject, DynamicObject and dynamic
- Source Generators
- Reflection
- Dynamic Type
- Roslyn Compiler and Analyzers in .NET – Introduction
- How to Call Generic Method Using Reflection
Console Applications and the Operating System
Talking to the machine .NET is running on.
- Console Class
- Read and Write Windows Registry
- Execute a PowerShell Script
- How to Determine the Operating System in .NET Core
- How to Detect if a Key is Pressed in a C# Console Application
- How to Read appsettings.json in a .NET Console Application
- How to Set the Exit Code for a Console Application
- Create Better Looking Console Applications With Spectre.Console
- How to Retrieve the Number of CPU Cores
- How to Force Run .NET Application as Administrator
- How to Execute CLI Applications From C#
NuGet Packages
Creating and publishing a package of your own.
- How to Create and Publish a NuGet Package with .NET CLI
- How to Create and Publish a NuGet Package Using Visual Studio
Debugging and Profiling
Getting the debugger to tell you something you did not already know.
- Debugging C# in Visual Studio
- Advanced Debugging
- Debugging and Profiling Multithreaded .NET Applications
- Basic Tips and Tricks to Boost Productivity in Visual Studio
Benchmarking and Performance
Measuring before changing, which is the whole discipline in one line.
- Managed vs Unmanaged Code (Garbage Collection)
- Memory Allocation Optimization With BenchmarkDotNet
- Introduction to Benchmarking in C# and ASP.NET Core Projects
- Baseline Styling in BenchmarkDotNet
- Top 11 C# Tips to Improve Code Quality and Performance
- Comparing Performance of the switch and if-else Statements
- Fastest Ways to Perform Base 10 Conversions
- How to Benchmark a Method's Performance Across Different .NET Versions
More Platform Topics
Odds and ends about the runtime and the tooling around it.
- Embedded Resources
- What is the Difference Between a DTO and a POCO?
- How to Access Configuration During Application's Startup
Where to Go Next
Where the platform meets the code you are actually writing:
The fastest way to get good at this layer is to read one error message properly instead of searching for it. Most of them name the exact registration, file or framework version that is wrong.
