型の爆発

.NET の「実行時型情報」は immutable かつ GC 不可能 - NyaRuRuの日記

現在のCLR実装で任意の型がメモリ上から簡単にアンロードできないというのは非常に厳しい制約だ。型が属しているAppDomainをアンロードすることで、型情報もアンロードすることは出来るが、過去の日記で言及した通り、AppDomainのアンロードは一筋縄では行かない処理である。

AppDomainの強制アンロードができない
AppDomainの強制アンロードができない part2.
AppDomainの強制アンロードができない part3.

AOPのインフラとして、日記中で取り扱ってきたCastle.DynamicProxyなどは、型を拡張して、動的に新たな型、モジュール、アセンブリを生成することでプロキシを実現しており、これは正にNyaRuRuさんが言うところの「実行時に実装型を合成するという手法」だが、Castle.DynamicProxyに限っていえば、さほど心配する必要は無いだろう。というのも、型を拡張して新たな型を作るといっても、無作為に型を生成していく訳ではなく、内部では拡張した型が既に生成されたことがあるかを判定しており、既生であれば(元の型が同じならば)キャッシュから生成済みの型を返すだけにしているからだ。

Type cacheType = GetFromCache(baseClass, interfaces);
if (cacheType != null)
{
    return cacheType;
}

とはいうものの、型が増えていくばかりでアンロードはされないし、GCの対象にもならないのは事実なのであり、特にASP.NET等のWebアプリケーションの場合、通年稼動するようなシステムもあるだろうと考えられるので、リソース管理に留意することは必要だろう。