Skip to content

Instantly share code, notes, and snippets.

View AArnott's full-sized avatar

Andrew Arnott AArnott

View GitHub Profile
@AArnott
AArnott / git-bisect-tool.ps1
Created June 5, 2025 02:13
A powershell script that can be given to git bisect to run a .NET test
# git bisect start --first-parent 5283fb074640b1 23d9058db6921f0f4849cd78d726e6cbb375c46c -- src/Nerdbank.MessagePack
# git bisect run pwsh.exe ./GetSize.ps1
$env:UseSharedCompilation='false' # prevent dotnet.exe from locking up between iterations
Write-Host "Git clean" -ForegroundColor Yellow
git clean -fdX -e obj/tools :/
Write-Host "Running init" -ForegroundColor Yellow
./init.ps1 -InstallLocality repo
if ($LASTEXITCODE -ne 0) { Write-Host "Aborting after exit code $LASTEXITCODE"; exit 125 }
Write-Host "Running publish" -ForegroundColor Yellow
dotnet publish test\AotNativeConsole
@AArnott
AArnott / FailInsteadOfCrash.cs
Created May 16, 2025 14:22
Fail tests instead of crashing the test host in .NET test processes
using System.Diagnostics;
using System.Runtime.CompilerServices;
internal static class AvoidCrashingOnDebugAsserts
{
[ModuleInitializer]
internal static void Initializer()
{
if (Trace.Listeners.OfType<DefaultTraceListener>().FirstOrDefault() is { AssertUiEnabled: true } defaultListener)
{
@AArnott
AArnott / mcp.schema.json
Last active June 17, 2025 11:08
The JSON schema used by Visual Studio 17.14 for mcp.json files
{
"type": "object",
"title": "Model Context Protocol Servers",
"additionalProperties": false,
"properties": {
"$schema": {
"type": "string",
"format": "uri"
},
"inputs": {
@AArnott
AArnott / Program.cs
Created March 9, 2025 22:58
AOT safe msgpack serialization with List<T>
using Nerdbank.MessagePack; // Comes from the Nerdbank.MessagePack nuget package
using PolyType;
namespace MessagePackBug;
[GenerateShape]
public partial record ItemsRequest(
[property:Key(0)]
string Prop1,
@AArnott
AArnott / CustomAttributeTypeProvider.cs
Created December 23, 2024 23:07
Reflect over generic attributes on .NET Framework
using System.Reflection.Metadata;
class CustomAttributeTypeProvider : ICustomAttributeTypeProvider<Type>
{
internal static readonly CustomAttributeTypeProvider Instance = new();
public Type GetPrimitiveType(PrimitiveTypeCode typeCode)
{
return SignatureTypeProvider.Instance.GetPrimitiveType(typeCode);
}
@AArnott
AArnott / EncyptionTools.ps1
Created June 24, 2024 17:04
Powershell functions for asymmetric encryption and decryption of data with an arbitrary length
Function Encrypt-DataAsymmetric {
[CmdletBinding()]
Param
(
[Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 0)]
[byte[]]$Data,
[Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true, Position = 1)]
[byte[]]$PublicKey
)
@AArnott
AArnott / azp-agent-linux.dockerfile
Created June 22, 2024 17:08
Scripts and dockerfile for running a private Azure Pipelines build agent on linux that supports jobs that create their own docker containers
# Inspired by https://github.com/MicrosoftDocs/azure-devops-docs/blob/main/docs/pipelines/agents/docker.md#linux
FROM ubuntu:22.04
ENV TARGETARCH="linux-x64"
# Also can be "linux-arm", "linux-arm64".
# Add a Capability that pipelines can filter to when they require a linux agent that supports creating docker containers.
ENV HasDockerAccess="true"
RUN apt-get update
RUN apt-get upgrade -y
@AArnott
AArnott / ConcurrentVsOrdinaryDictionary.cs
Last active May 11, 2022 08:33
The .NET Concurrent collections are often used as a thread-safe version of the ordinary collections. But they are *far* slower and heavier on GC pressure than simply adding a `lock` around use of the ordinary collections. Avoid the concurrent collections except in highly concurrent scenarios where you see high lock contention and therefore may b…
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Diagnostics;
class Program
{
static void Main(string[] args)
{
var ordinary = RunTest(OrdinaryDictionaryRun);
@AArnott
AArnott / PatGenerator.cs
Created April 8, 2019 20:51
Securely generates new PATs. Useful for a service that wants to issue PATs to users.
using System;
using System.Security.Cryptography;
public static class SecurityUtilities
{
static void Main(string[] args)
{
Console.WriteLine(GeneratePat());
Console.WriteLine(GeneratePat());
Console.WriteLine(GeneratePat());
@AArnott
AArnott / Cancellation.cs
Last active October 16, 2024 17:10
Graceful console app cancellation on Ctrl+C
class Program
{
static async Task Main(string[] args)
{
// Add this to your C# console app's Main method to give yourself
// a CancellationToken that is canceled when the user hits Ctrl+C.
var cts = new CancellationTokenSource();
Console.CancelKeyPress += (s, e) =>
{
Console.WriteLine("Canceling...");