Side-by-Side実行

「Side-by-Side実行」については吉松さんの分かりやすい解説記事を@ITで読むことができます.

サイドバイサイド実行とは、文字通り実行時の話で、インストール時の話ではない点に注意してほしい。サイドバイサイド実行とは、「GAC(グローバル・アセンブリ・キャッシュ)に複数のバージョンをインストールできること」ではないし、「複数のバージョンが共存できること」でもない。コンパイル時とまったく同じアセンブリを使い続けることを意味する。

「Side-by-Side実行」では,同一プロセス内にバージョンの異なるふたつのアセンブリを同時に実行することが出来ます.つまり,バージョン管理にまつわる悲劇の果てに我々がたどり着いたのは,現在と過去の同居する不思議な世界ということになります.
バージョンの異なるふたつのアセンブリを同時に存在させることで生じる困難は,そもそも発端であるコンポーネントのバージョン管理に関する問題とともに『Essential .NET (asin:4891003685)』の2.7章で詳しく論じられています.想定される困難には以下のようなものが挙げられています.

  • staticフィールドが複数存在することがありうる.コーディング時に特定リソースがひとつしか存在しないと仮定して書かれたコードは動かなくなる.
  • メソッドの引数でバージョンが異なる型が渡されることがある.現実的にはpublicな型のバージョンは固定するべきである.

また,同書には次のような興味深い記述もあります.すなわち,CLRにはアセンブリを修飾する次のような属性が既に定義されているそうです.

nonsidebysideappdomain
アセンブリはAppDomainごとにひとつのバージョンしかロードできない.
nonsidebysideprocess
アセンブリはプロセスごとにひとつのバージョンしかロードできない.
nonsidebysideamachine
アセンブリはマシン全体でひとつのバージョンしかロードできない.

ただし『Essential .NET』執筆時のCLRのアセンブリローダーは,これら3つの属性を無視するとこのとこでした.
"Side-by-Side"と名が付いているだけで理解したつもりになっていると火傷をしそうなあたり,"Active"の名を冠したいくつかの技術を思い出させてくれます,はい.