きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

nuspecで特定のバージョンを指定してGACのアセンブリの参照追加を行う方法

NuGetパッケージを作成する際、nuspecのframeworkAssemblies/frameworkAssemblyに記述を行うことで、GACに登録されている任意のアセンブリへの参照設定を追加することができます。
(See:Nuspec Reference:Specifying Framework Assembly References (GAC))


例えばこんな風にnuspec内に書いてあげると…。


パッケージを取り込んだプロジェクトではこのように参照が追加されます。




さて、ここからが今回の本題。
GACのアセンブリの中には、同じ名前でバージョンが異なるものがインストールされている場合があります。例えばこんな感じ。


この例ではMicrosoft.TeamFoundation.Clientは、バージョン「10.0.0.0」と「11.0.0.0」の二つのバージョンがGACにインストールされているのが解ります*1


このとき、先ほどの例と同様『<frameworkAssembly assemblyName="Microsoft.TeamFoundation.Client" />』と記述するとどうなるか。
答えはこの通り。どうやら自動的に最新の方が参照されるようです。



では、例えば『必ず10.0.0.0のほうを参照させたい』といったように、参照追加するアセンブリバージョンを指定したい場合はどうすればいいでしょうか*2
公式のドキュメントを見ても該当する記述が見つけられずちょっと途方に暮れかけたのですが、ダメもとで試してみたところ、assemblyName属性の中にアセンブリ名に加え、カンマ区切りでVersion="x.x.x.x"の形でバージョンを記述*3することで実現できることが解りました。先の例だと、『<frameworkAssembly assemblyName="Microsoft.TeamFoundation.Client, Version=10.0.0.0" />』となります。

frameworkAssemblies全体のイメージだとこんな感じ。

こんな風に指定してやると、ちゃんと以下のように指定されたバージョンのアセンブリを参照するようです。

*1:VS2010付属版が10.0.0.0でVS2012付属版が11.0.0.0と思われる

*2:現実的にそうしたいことがあるかというと…まさに今日、そんなことがあったのでした。

*3:Web.Config等でアセンブリを参照するときと同じ書き方