Exploring the generated code: T[], Span, and Immutable collections: Behind...
This is the third post in the series: Behind the scenes of collection expressions. Part 1 - Introducing collection expressions in C#12 Part 2 - Exploring the generated code: List<T> and fallback...
View ArticleExploring the generated code: the spread element: Behind the scenes of...
This is the fourth post in the series: Behind the scenes of collection expressions. Part 1 - Introducing collection expressions in C#12 Part 2 - Exploring the generated code: List<T> and...
View ArticleAdding support for collection expressions to your own types: Behind the...
This is the fifth post in the series: Behind the scenes of collection expressions. Part 1 - Introducing collection expressions in C#12 Part 2 - Exploring the generated code: List<T> and fallback...
View ArticleDisambiguating types with the same name with extern alias
In this post I describe a relatively niche scenario, in which you have references to two libraries that both define a given type. This type has the same name in both libraries (the same type name and...
View ArticleCreating source-only NuGet packages
In this post I describe how to create a source-only NuGet package. I discuss what source-only NuGet packages are, why you might want to create one, and how to build a project as a source-only package....
View ArticleSimplifying [Theory] test data with Xunit.Combinatorial
In this post I show how you can simplify your xUnit [Theory] tests using the Xunit.Combinatorial package. This package has a bunch of features that can make it easier to generate the test data you...
View ArticleCombining multiple docker images into a multi-arch image
In this post I show how you can create multi-arch docker images by combining separate x64 and arm46 images into a single docker image. I described an easy way to create multi-arch images in a previous...
View ArticleAvoiding CDN supply-chain attacks with Subresource Integrity (SRI)
There's been a lot of tech on the news recently. There was the xz-utils backdoor in March, the Crowdstrike outage in July, and in the middle there was the Pollyfill.io supply chain attach. It's the...
View ArticleUsing Azure Storage Queue messages with Azure Functions and [QueueTrigger]
In this post I discuss the differences between the Azure Storage Queue message queue service and how it compares to Azure Service Bus in terms of functionality. After comparing the services, I...
View ArticleWorking with tar files in .NET 8
Back in 2022 .NET 7 gained support for natively working with tar files in the base class library. In this post I describe how to perform some basic operations on tar files, how I typically use the tar...
View ArticlePreventing breaking changes in public APIs with PublicApiGenerator
In this post I shows how to use two open source libraries to keep track of the public API surface of any NuGet libraries (or any other code) you create. The approach shown in this post uses a unit...
View ArticleFixing MAX_PATH issues in GitLab
This post is a short reminder for my future self, for when I next have to fight with MAX_PATH issues and GitLab. Yes, it's 2024, and I'm still being sabotaged by Window's archaic MAX_PATH restriction....
View ArticleMajor updates to NetEscapades.​AspNetCore.​SecurityHeaders
In this post I provide an update on the NetEscapades.AspNetCore.SecurityHeaders project. I've just released a preview version of 1.0.0, which addresses some longstanding requests for extra...
View ArticleReplacing Exceptions-as-flow-control with the result pattern: Working with...
This is the first post in the series: Working with the result pattern. Part 1 - Replacing Exceptions-as-flow-control with the result pattern (this post) In this post I provide a worked example of...
View ArticleSafety and simplicity with LINQ: Working with the result pattern - Part 2
This is the second post in the series: Working with the result pattern. Part 1 - Replacing Exceptions-as-flow-control with the result pattern Part 2 - Safety and simplicity with LINQ (this post) This...
View ArticleAdding more extensions to Result: Working with the result pattern - Part 3
This is the third post in the series: Working with the result pattern. Part 1 - Replacing Exceptions-as-flow-control with the result pattern Part 2 - Safety and simplicity with LINQ Part 3 - Adding...
View ArticleIs the result pattern worth it?: Working with the result pattern - Part 4
This is the fourth post in the series: Working with the result pattern. Part 1 - Replacing Exceptions-as-flow-control with the result pattern Part 2 - Safety and simplicity with LINQ Part 3 - Adding...
View ArticleRecent updates for NetEscapades.EnumGenerators: interceptors!
In this post I describe a recent update to the NetEscapades.EnumGenerators package. The big new feature introduced in 1.0.0-beta11 is experimental support for interceptors. Interceptors allow you to...
View ArticleCross-Origin-Opener-Policy: preventing attacks from popups: Understanding...
This is the first post in the series: Understanding cross-origin security headers. Part 1 - Cross-Origin-Opener-Policy: preventing attacks from popups (this post) In this post I describe the...
View ArticleCross-Origin-Resource-Policy: preventing hotlinking and XSSI attacks:...
This is the second post in the series: Understanding cross-origin security headers. Part 1 - Cross-Origin-Opener-Policy: preventing attacks from popups Part 2 - Cross-Origin-Resource-Policy:...
View Article