Assembly Loading, AssemblyLoadContext & Assembly Isolation
1Concept
`AssemblyLoadContext` (ALC) manages loading, resolving, and unloading managed assemblies at runtime. Unlike .NET Framework AppDomains, ALC enables plugin architectures with collectible dynamic unloading.
2Architecture Diagram
[ Default AssemblyLoadContext ] ── Core framework (.NET 9)
│
├──> [ Plugin ALC 1 ] ── Isolated dependencies (v1.0.0)
└──> [ Plugin ALC 2 ] ── Isolated dependencies (v2.0.0)
│ (Collectable: Unloads when garbage collected)3Code Example
C# 13 & .NET 9
using System;
using System.Runtime.Loader;
public class AlcDemo
{
public static void Main()
{
var defaultContext = AssemblyLoadContext.Default;
Console.WriteLine($"Default ALC: {defaultContext.Name}");
Console.WriteLine($"Loaded Assemblies: {defaultContext.Assemblies.Count()}");
var customAlc = new AssemblyLoadContext("PluginContext", isCollectible: true);
Console.WriteLine($"Created Collectible ALC: {customAlc.Name}, IsCollectible: {customAlc.IsCollectible}");
customAlc.Unload();
Console.WriteLine("Plugin ALC successfully signaled for unloading.");
}
}4Expected Output
Default ALC: Default Loaded Assemblies: 14 Created Collectible ALC: PluginContext, IsCollectible: True Plugin ALC successfully signaled for unloading.
5Key Takeaways
- ✓`AssemblyLoadContext` is the modern .NET foundation for plugins without assembly version conflicts.
- ✓Collectible ALCs allow full memory reclamation of unloaded C# modules.
- ✓Never hold static references to types from a collectible context to prevent unload leaks.