Phase 1 of 30 · Topic 1.4

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.