Paulo Morgado's Avatar

Paulo Morgado

@paulomorgado.net

Technical Lead Vision-Box. ex-Microsoft. MVPAward alumnus. Opinions are my own.

159
Followers
326
Following
609
Posts
30.07.2023
Joined
Posts Following

Latest posts by Paulo Morgado @paulomorgado.net

Preview
Splitting the NetEscapades.EnumGenerators packages: the road to a stable release In this post I describe the recent architectural changes to the NetEscapades.EnumGenerators package, which is now a metapackage, to support more scenarios
10.03.2026 12:55 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Extend your coding agent with .NET Skills Introducing the dotnet/skills repository and how .NET agent skills can improve coding agent workflows.
10.03.2026 08:34 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Release v1.0 of the official MCP C# SDK What’s new in the MCP C# SDK v1.0, including enhanced authorization, richer metadata, tool calling enhancements and long-running requests.
08.03.2026 16:06 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Aspire Conf β€” March 23, 9:00a PT Aspire streamlines your development workflow with code-first control, modularity, and observability for distributed applications.
04.03.2026 20:34 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Writing a .NET Garbage Collector in C# - Part 8: Interior pointers Using NativeAOT to write aΒ .NET GC in C#. This time, we look at what interior pointers are and why they’re so challenging for the GC. We also introduce the concept of brick table.
03.03.2026 15:31 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Cake - Cake v6.1.0 released Version 6.1.0 of Cake has been released. Take it for a spin and give us feedback on our discussion board. This release includes new features, improvements, and bug fixes to both Cake Scripting, Cake Frosting, and Cake Sdk since the Cake v6.0.0 release! πŸš€ 🍰 Highlights of this release FormattableString support in logging β€” Use interpolated strings and FormattableLogAction with Error, Warning, Information, Verbose, and Debug for cleaner logging. Cake.Sdk In-Process NuGet client support - Install any NuGet package into tools .slnx support β€” DotNetTest and solution parsing now recognize .slnx (XML solution) files; PathType autodetection includes .slnx. NuGet Pack readme β€” NuGetPack supports the package readme file via the new ReadMe setting. AssemblyInfo creator β€” You can now add multiple instances of the same custom attribute (e.g. multiple InternalsVisibleTo). In-Process NuGet authentication β€” In-process NuGet restore supports authenticated feeds (e.g. GitHub Package Registry) via NuGet_ConfigFile and credential providers. GitLab CI β€” Build, and pipeline IDs are now long instead of int, so they work on gitlab.com where IDs exceed 32-bit range (breaking for code that stores them in int). Bug fixes β€” DotNetPublish uses non-boolean --self-contained arguments; DotNetSlnList respects DOTNET_CLI_UI_LANGUAGE; Frosting command-line configuration parsing corrected; console log colorization fixed. Dependency and SDK updates FormattableString support in logging You can now pass interpolated strings directly to the logging aliases, so formatting is clear, and the cost of building the message is only paid when the log level is active. Using a FormattableString (interpolated string): var project = "MyApp"; var version = "1.0.0"; Information($"Building {project} v{version}"); Using FormattableLogAction for lazy evaluation (the message is only formatted if the current verbosity allows it): Verbose(log => log($"Processing {items.Count} items in {stopwatch.ElapsedMilliseconds} ms")); All of Error, Warning, Information, Verbose, and Debug support both overloads. Cake.Sdk In-Process NuGet client support Cake.Sdk now goes beyond .NET tools: you can install and run any NuGet package with #tool / InstallTool, just like Cake.Tool already does. That makes it easy to pull in platform-specific packages (e.g. Bicep CLI) and invoke them with Command or the tool aliases. Example: installing the Bicep CLI for the current OS and architecture, then running it: Task("Install-Bicep") .Does(() => { var osArch = (Context.Environment.Platform.Family, RuntimeInformation.OSArchitecture); Information($"Installing bicep tool for {osArch}"); FilePath[] bicepToolPaths; switch (osArch) { case (PlatformFamily.Windows, System.Runtime.InteropServices.Architecture.X64): bicepToolPaths = InstallTool("nuget:?package=Azure.Bicep.CommandLine.win-x64&version=0.41.2&include=/**/bicep.exe"); break; case (PlatformFamily.Windows, System.Runtime.InteropServices.Architecture.Arm64): bicepToolPaths = InstallTool("nuget:?package=Azure.Bicep.CommandLine.win-arm64&version=0.41.2&include=/**/bicep.exe"); break; case (PlatformFamily.Linux, System.Runtime.InteropServices.Architecture.X64): bicepToolPaths = InstallTool("nuget:?package=Azure.Bicep.CommandLine.linux-x64&version=0.41.2&include=/**/bicep"); break; case (PlatformFamily.Linux, System.Runtime.InteropServices.Architecture.Arm64): bicepToolPaths = InstallTool("nuget:?package=Azure.Bicep.CommandLine.linux-arm64=0.41.2&include=/**/bicep"); break; case (PlatformFamily.OSX, System.Runtime.InteropServices.Architecture.X64): bicepToolPaths = InstallTool("nuget:?package=Azure.Bicep.CommandLine.osx-x64&version=0.41.2&include=/**/bicep"); break; case (PlatformFamily.OSX, System.Runtime.InteropServices.Architecture.Arm64): bicepToolPaths = InstallTool("nuget:?package=Azure.Bicep.CommandLine.osx-arm64&version=0.41.2&include=/**/bicep"); break; default: Warning($"Platform {osArch.Family} with architecture {osArch.OSArchitecture} is not supported."); return; } var bicepTool = bicepToolPaths.FirstOrDefault() ?? throw new FileNotFoundException("Failed to resole tool"); Information($"Installed bicep to {bicepTool}"); Command( new CommandSettings { ToolExecutableNames = ["bicep", "bicep.exe"], ToolName = "bicep", ToolPath = bicepTool }, "--version"); }); Contributors This release was made possible thanks to the Cake team and the contribution of these awesome members of the Cake community listed below: Full details of everything that was included in this release can be seen below. Issues As part of this release we had 43 issues closed. Breaking change #4656 Gitlab CI_PIPELINE_ID has exceeded the int limits on gitlab.com and the variable should be changed to a long. Feature #4698 Add FormattableString Support to Logging Methods. #4071 Unable to set multiple of the same attribute CustomAttributes in AssemblyInfo creator. #3517 NuGet Pack Should support new readme file. #2028 In-Process NuGet doesn't support authentication. Improvement #4740 Add CakeModule assemmbly attribute to NuGetModule. #4737 Update Microsoft.Extensions.DependencyInjection to 9.0.13 & 10.0.3 (net9.0&net10.0). #4735 Update Microsoft.IdentityModel.JsonWebTokens to 8.16.0. #4733 Update NuGet.* to 7.3.0. #4715 Update System.Security.Cryptography.Pkcs to 9.0.12 & 10.0.2 (net9.0&net10.0). #4713 Update Microsoft.Extensions.DependencyInjection to 9.0.12 & 10.0.2 (net9.0&net10.0). #4694 Update Autofac to 9.0.0. #4692 Update System.Security.Cryptography.Pkcs to 10.0.1 for net10.0. #4688 Update Microsoft.IdentityModel.JsonWebTokens to 8.15.0. #4685 Update Microsoft.Extensions.DependencyInjection to 10.0.1 for net10.0. #4683 Update Microsoft.CodeAnalysis.CSharp.Scripting to 5.0.0. #4679 Update Basic.Reference.Assemblies.* to 1.8.4. #4677 Update NuGet.* to 7.0.1. #4675 Update Spectre.Console & Spectre.Console.Cli to 0.54.0 & 0.53.1. #4658 Add support for MSBuild 18 and VS2026. #4635 DotCover no longer works with version 2025.2+ of JetBrains.dotCover.CommandLineTools. Bug #4720 Use non-boolean self-contained arguments for dotnet publish. #4706 Add support for .slnx files in dotnet test PathType autodetection. #4687 Cake Frosting FrostingConfiguration Command Line parameters are not parsed correctly. #4667 DotNetSlnList hardcodes English output. #4662 Colorization of console log output.
02.03.2026 13:35 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
.NET 10: System.Text.Json Improvements Introduction System.Text.Json continues to evolve in .NET 10 with meaningful improvements focused on correctness and...
02.03.2026 08:26 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
.NET Synchronisation APIs - Part 1 - In-Process Synchronisation .NET Locking APIs - Part 1 - In-Process Synchronisation
27.02.2026 08:43 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Vector Data in .NET Building Blocks for AI Part 2 Explore the power of Vector Data in .NET AI for enhancing semantic searches and intelligent applications.
26.02.2026 19:56 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Visual Studio February Update - Visual Studio Blog This month’s Visual Studio update continues our focus on helping you move faster and stay in flow, with practical improvements across AI assistance, debugging, testing, and modernization. Building on the momentum from January’s editor updates, the February release brings smarter diagnostics and targeted support for real world development scenarios, from WinForms maintenance to C++ modernization. […]
25.02.2026 14:37 πŸ‘ 0 πŸ” 1 πŸ’¬ 0 πŸ“Œ 0
Is it faster to index into an array or use switch statement for lookups? | tabs β†Ή over ␣ ␣ ␣ spaces by JiΕ™Γ­ {x2} Činčura While working on a PR in Microsoft.Extensions.Logging I saw two variations of code and I wanted to check which one is faster. Not that it mattered in this piece of code, but every little counts and also, I like to explore random things. Assume you have some numbers (zero-based) that represent predefined strings. And you want to convert those numbers. Code One way to do it is to put the strings into an array and directly index into it. static readonly string[] Strings = [ "Trace", "Debug", "Information", "Warning", "Error", "Critical", "None", ]; public string Array(int i) => i < Strings.Length ? Strings[i] : i.ToString(); Simple enough and you have the benefit of reusing the array elsewhere when needed. Another way to do it is to use switch expression (or switch statement or plain old ifs). This generally compiles – for dense values – to jump table, which is logically equvivalent to what the Array version is doing. public string Switch(int i) => i switch { 0 => "Trace", 1 => "Debug", 2 => "Information", 3 => "Warning", 4 => "Error", 5 => "Critical", 6 => "None", _ => i.ToString(), }; Before looking at the results, pause and take a guess. I like the directness of switch expression and hence it was my favorite. But purely because of syntax. For performance I had no theory why one should be faster than other (hence I’m benchmarking it). Results Array 0 0.6266 ns 0.0083 ns 0.0421 ns 0.6196 ns Switch 0 0.2909 ns 0.0376 ns 0.1918 ns 0.4013 ns Array 1 0.3694 ns 0.0386 ns 0.1933 ns 0.2540 ns Switch 1 0.2992 ns 0.0411 ns 0.2088 ns 0.4200 ns Array 2 0.3619 ns 0.0401 ns 0.2001 ns 0.2471 ns Switch 2 0.4052 ns 0.0066 ns 0.0334 ns 0.4053 ns Array 3 0.3354 ns 0.0332 ns 0.1667 ns 0.2424 ns Switch 3 0.1475 ns 0.0390 ns 0.1982 ns 0.0156 ns Array 4 0.5061 ns 0.0381 ns 0.1909 ns 0.6168 ns Switch 4 0.1552 ns 0.0375 ns 0.1896 ns 0.0349 ns Array 5 0.6364 ns 0.0059 ns 0.0297 ns 0.6354 ns Switch 5 0.1437 ns 0.0369 ns 0.1878 ns 0.0244 ns Array 6 0.5053 ns 0.0392 ns 0.1997 ns 0.6210 ns Switch 6 0.4150 ns 0.0064 ns 0.0323 ns 0.4130 ns Array 7 1.2289 ns 0.0056 ns 0.0280 ns 1.2287 ns Switch 7 1.1047 ns 0.0087 ns 0.0437 ns 1.0973 ns OK. First and foremost, looking at those numbers it is clear that none of this matter. πŸ™‚ The hardcoded values are all under 1 nanosecond. The Switch version is consistently faster than Array except for 2, but in those ranges I consider those numbers more or less identical (Branch prediction probably helped, but it helped in both cases.). For 7 we see the fallback to ToString, which has non-trivial cost (especially for big numbers). What does it mean? It means that there’s no surprise and you should use whichever version fits your needs (or preference). Appendix BenchmarkDotNet v0.15.8, Windows 11 (10.0.26200.7781/25H2/2025Update/HudsonValley2) 11th Gen Intel Core i9-11900 2.50GHz, 1 CPU, 16 logical and 8 physical cores .NET SDK 10.0.103 [Host] : .NET 10.0.3 (10.0.3, 10.0.326.7603), X64 RyuJIT x86-64-v4 LongRun : .NET 10.0.3 (10.0.3, 10.0.326.7603), X64 RyuJIT x86-64-v4 [LongRunJob] public class Bench { public static IEnumerable<int> Values() => [0, 1, 2, 3, 4, 5, 6, 7]; static readonly string[] Strings = [ "Trace", "Debug", "Information", "Warning", "Error", "Critical", "None", ]; [Benchmark, ArgumentsSource(nameof(Values))] public string Array(int i) => i < Strings.Length ? Strings[i] : i.ToString(); [Benchmark, ArgumentsSource(nameof(Values))] public string Switch(int i) => i switch { 0 => "Trace", 1 => "Debug", 2 => "Information", 3 => "Warning", 4 => "Error", 5 => "Critical", 6 => "None", _ => i.ToString(), }; } JiΕ™Γ­ Činčura is .NET, C# and Firebird expert. He focuses on data and business layers, language constructs, parallelism, databases and performance. For almost two decades he contributes to open-source, i.e. FirebirdClient. He works as a senior software engineer for Microsoft. Frequent speaker and blogger at www.tabsoverspaces.com.
25.02.2026 14:19 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Use Windows on-device AI in your Electron app - #ifdef Windows Last year we published AI Dev Gallery, an open-source app full of interactive Windows AI examples. A common follow-up question from Electron developers has been: β€œHow can we build similar on-device AI experiences in our Electron apps?” In this blog, we’ll walk through how we built an Electron app filled with samples of on-device Windows […]
25.02.2026 14:06 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Recording metrics in-process using MeterListener: System.Diagnostics.Metrics APIs - Part 4 In this post I show how you can use MeterListener to listen to Instrument measurements, how to trigger Observable measurements, and how to aggregate values.
24.02.2026 10:39 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Too good to be true: an unexpected profiler trap Sometimes the most convincing performance gains deserve a second look. A reminder that profiling data can be more subtle than it first appears.
21.02.2026 13:16 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Custom Agents in Visual Studio: Built in and Build-Your-Own agents - Visual Studio Blog Explore Custom Agents in Visual Studio to enhance your development workflow with tailored automation and advanced debugging.
20.02.2026 09:28 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
T4 templates on modern .NET | endjin T4 is a .NET-based templating language. It used to target just .NET Framework. It is now possible to use modern .NET runtimes, but it requires additional work. This post shows how to get it working.
18.02.2026 15:38 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Creating standard and "observable" instruments: System.Diagnostics.Metrics APIs - Part 3 In this post I discuss the various InstrumentT types exposed by the System.Diagnostics.Metrics API and show examples from the .NET libraries and ASP.NET Core
18.02.2026 08:49 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Getting started with OpenTelemetry .NET – Software / Wetware OpenTelemetry has quickly established itself as the standard observability framework, and is now supported by every major observability platform and programming language, including Microsoft .NET. The .NET libraries provide instrumentation across a wide range of components, and connection options to many observability platforms, either via the standard OpenTelemetry Protocol (OTLP), custom connectors, or the OpenTelemetry Collector. Using observability platforms, whilst powerful, require infrastructure setup that can slow down getting started. This article introduces the Essential OpenTelemetry Colored Console exporter, allowing you to use OpenTelemetry in your .NET projects from day one, supporting development without needing any additional infrastructure, while setting you up for future access to the entire rich OpenTelemetry ecosystem. Adding the OpenTelemetry Colored Console OpenTelemetry is the industry-standard observability framework for traces, metrics, and logs. You can get started with OpenTelemetry, for a standard .NET 10 host application, with just three simple steps: Add the necessary nuget package references: dotnet add package OpenTelemetry.Extensions.Hosting dotnet add package Essential.OpenTelemetry.Exporter.ColoredConsole Add the necessary using statements: using Essential.OpenTelemetry; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; Clear the default loggers, and configure OpenTelemetry with the colored console exporter, assuming a standard WebApplicationBuilder or HostApplicationBuilder: builder.Logging.ClearProviders(); builder.Services.AddOpenTelemetry() .WithLogging(logging => { logging.AddColoredConsoleExporter(); }); That's it. If you were previously using the default logger, there is nothing more to do, and your logs will appear similar to the screenshot above. You are now using OpenTelemetry, with console logs showing OpenTelemetry features such as log event names and trace correlation IDs. You can continue development as normal, knowing that in the future you will have access to the OpenTelemetry ecosystem when needed. What is OpenTelemetry ? OpenTelemetry is the industry movement that arose from the W3C Trace Identifier standardisation, and the combination of two open source projects OpenCensus and OpenTracing. It provides an open source, vendor neutral framework for observability, supporting traces, metrics, and logs, and with instrumentation for many systems provided out of the box. OpenTelemetry has a strong ecosystem of vendors and languages, and many platforms have made it the default for interoperability. Instrumentation libraries Pre-built instrumentation libraries are available for various components, e.g. for an ASP.NET application you can use the OpenTelemetry.Instrumentation.AspNetCore package for traces and metrics. Following on from the basic setup, above: dotnet add package OpenTelemetry.Instrumentation.AspNetCore Then add the additional usings and OpenTelemetry configuration: using OpenTelemetry.Metrics; using OpenTelemetry.Trace; ... .WithTracing(tracing => { tracing.AddAspNetCoreInstrumentation().AddColoredConsoleExporter(); }) .WithMetrics(metrics => { metrics .AddAspNetCoreInstrumentation() .AddView(instrument => instrument.Name.StartsWith("http.server.request", StringComparison.Ordinal) ? null : MetricStreamConfiguration.Drop ) .AddColoredConsoleExporter(options => { }, exportIntervalMilliseconds: 60_000); }); Note that the AddView() filtering is an advanced configuration and only shown to limit the metrics for readability of the example. Example output: The ASP.NET trace instrumentation will output a span for each web request path, along with the duration, e.g. 13:25:07 SPAN [GET /] bd77d8bc415055f0d85fd1fdd5dde838-0cfd88b3f04281b6 84ms. Trace instrumentation is also available for HTTP client, SQL Server, Entity Framework, and many other components. ASP.NET instrumentation metrics have been filtered with to show just HTTP requests for the purpose of this example. Metrics show, over a specified time period, the count of requests by route and status code, with the sum of response time, for statistical calculations, e.g. 13:26:01 METRIC [http.server.request.duration] 60s unit=s http.request.method=GET http.response.status_code=200 http.route=/ network.protocol.version=1.1 url.scheme=http count=2 min=0.0008918 max=0.0793882 sum=0.08028 Note that while metrics are supported in the console, they may be more useful if you sent them to an observability platform that can aggregate them and generate reports. Example application If you just want an example getting started application, then open a terminal or command prompt and create a new console application: dotnet new console -n HelloOpenTelemetry cd HelloOpenTelemetry Install the necessary NuGet packages: dotnet add package Microsoft.Extensions.Hosting dotnet add package OpenTelemetry.Extensions.Hosting dotnet add package Essential.OpenTelemetry.Exporter.ColoredConsole And replace the contents of Program.cs with the following code: using Essential.OpenTelemetry; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; // Create the application host with OpenTelemetry var builder = Host.CreateApplicationBuilder(args); // Clear default logging providers and configure OpenTelemetry builder.Logging.ClearProviders(); builder .Services.AddOpenTelemetry() .WithLogging(logging => { logging.AddColoredConsoleExporter(); }); var host = builder.Build(); // Get the logger from the service provider var logger = host.Services.GetRequiredService<ILogger<Program>>(); // Log some messages logger.LogInformation("Hello World!"); logger.LogWarning("This is a warning message"); logger.LogError("This is an error message"); More tutorials and examples are provided in the Getting Started section of the project on github. What about the standard OpenTelemetry console exporter? While the OpenTelemetry .NET libraries do include a console exporter, it is aimed towards learning and examining the internal workings of OpenTelemetry, and is not suitable for everyday development. The output is very verbose, providing many lines of details for each single operation, covering the full set of fields that are used. For example, a simple program with one log message, one span, and one metric produces just 3 lines with the colored console exporter, but over 35 lines with the standard console exporter β€” enough to fill an entire terminal screen. If you want to learn more about the intricacies of OpenTelemetry, you can easily enable it, but for regular development you are better off using the colored console exporter. Next steps Once you have the basic console exporter in place, you can continue development, secure that you have access to OpenTelemetry as needed in the future, whether that is setting up a local observability platform or deploying to a cloud observability provider. See my earlier article of examples using observability platforms from OpenTelemetry .NET for: How to set up a resource builder for OpenTelemetry metadata Using local observability platforms such as Loki and Jaeger Using a cloud observability platform such as Azure Monitor Using the OpenTelemetry Collector agent
13.02.2026 09:03 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Unlock language-specific rich symbol context using new find_symbol tool - Visual Studio Blog Refactoring at scale is a time-consuming and error-prone process for developers. In large codebases, developers have relied on manual searches and incremental edits across multiple files to accomplish these tasks. Modern development workflows depend on fast and accurate code navigation to avoid these pitfalls. When developers refactor existing code, explore unfamiliar areas of a large […]
11.02.2026 19:42 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
EF Core State Validation Introduction How many times have you tried to save changes to your context only to get an exception about validation problems, like a requi...
11.02.2026 19:28 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
GitHub Copilot Testing for .NET Brings AI-powered Unit Tests to Visual Studio 2026 Visual Studio 18.3 brings GitHub Copilot Testing for .NET, an AI-powered test agent for generating and managing unit tests across your codebase.
11.02.2026 19:24 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Writing a .NET Garbage Collector in C# - Part 7: Marking handles Using NativeAOT to write aΒ .NET GC in C#. In the seventh part, we scan and update the handles during the mark phase of the garbage collection.
10.02.2026 19:51 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
.NET and .NET Framework February 2026 servicing releases updates - .NET Blog A recap of the latest servicing updates for .NET and .NET Framework for February 2026.
10.02.2026 19:47 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Getting more information in MSBuild binlogs with property tracking - GΓ©rald BarrΓ© Learn how to enable MSBuild property tracking to get detailed information about property changes in your build logs.
09.02.2026 13:19 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Modern Mapping with EF Core Introduction In EF Core (as in most O/RMs) we can map and store multiple things: Objects that hold a single value, like int , string ,...
09.02.2026 12:34 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Encrypting Properties with System.Text.Json and a TypeInfoResolver Modifier (Part 2) - Steve Gordon - Code with Steve In this post, we build out the AES-GCM encryption layer that we will depend on in future posts to decrypt JSON properties using System.Text.Json.
06.02.2026 13:35 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Securing Aspire Apps with Microsoft Entra ID Secure Aspire apps with Entra ID authentication SDKs. automate with AI Agent skills. A video shows how to start. Try and learn how this works
06.02.2026 13:31 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
.NET Framework 3.5 Moves to Standalone Deployment in new versions of Windows An announcement of .NET Framework 3.5 servicing updates on new versions of Windows.
06.02.2026 12:10 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
WinGet Configuration: Set up your dev machine in one command - Microsoft for Developers I’ve set up a lot of dev machines in my life. Traditionally, this takes a lot of time to get everything just right, but now there’s a faster way with WinGet Configuration files. Let me show you how to go from a fresh Windows install to a fully configured dev environment with a single command […]
05.02.2026 11:11 πŸ‘ 1 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0
Preview
Creating recursion in TPL Dataflow with LinkTo predicates In the previous post , I showed how to use LinkTo predicates to route messages conditionally across different blocks. Today, we're going to...
04.02.2026 17:15 πŸ‘ 0 πŸ” 0 πŸ’¬ 0 πŸ“Œ 0