WebSurfer's Home

トップ > Blog 1   |   Login
Filter by APML

Mvc.dll のバージョン相違

by WebSurfer 12. January 2015 16:06

Windows Update によって、知らないうちに System.Web.Mvc.dll のバージョンが変わり、突然 Visual Studio で MVC アプリケーションのビルドが通らなくなったという話を書きます。ちょっと古い話ですが、またあるかもしれませんので、備忘録として。

System.Web.Mvc.dll

2014 年の 5 月中旬の Windows Update に含まれる Microsoft ASP.NET MVC セキュリティ更新プログラム MS14-059 (KB2990942) によって、参照先(C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 3\Assemblies\System.Web.Mvc.dll)の System.Web.Mvc.dll のバージョンが 3.0.0.0 から 3.0.0.1 に変わってしまいました。上の画像を参照ください。

Visual Studio 2010 の MVC3 インターネットアプリケーションのテンプレートを使って Web アプリを作ると、「ローカルコピー」が False になっているので(上の画像を参照・・・True にすると bin フォルダにコピーされる)、アプリは上に書いた参照先の .dll を参照しますが、プロジェクトファイル (.csproj) では 3.0.0.0 の指定のままなので、バージョン不一致でビルドが通らないと言うことのようです。

解決策は stckoverflow の記事 ASP.NET MVC security patch to version 3.0.0.1 breaks build [duplicate] にありますように、以下の手段を取るのがよさそうです。

  1. Visual Studio の「ソリューションエクスプラーラー」で、System.Web.Mvc の参照設定を一旦削除してからやり直す。

    蛇足ですが、手動でプロジェクトファイルを編集する方法もあるそうです。興味がありましたら、msdn ブログの記事 Visual Studio で現在開いてるプロジェクトファイル (.csproj, .vbproj) を編集する方法 を見てください。
  2. 「ローカルコピー」プロパティを False から True に変更する。(上の画像を参照。今後の Windows Update による影響を受けないようにするため)
  3. web.congfig の bindingRedirect 要素を以下のように修正する。
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity 
          name="System.Web.Mvc" 
          publicKeyToken="31bf3856ad364e35" />
      <bindingRedirect 
          oldVersion="1.0.0.0-3.0.0.0" 
          newVersion="3.0.0.1" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

なお、MVC4 でも System.Web.Mvc.dll のバージョンは 4.0.0.0 から 4.0.0.1 に変わっています(未確認ですが、MVC2, MVC5 も同様だと思います)。ただし、MVC4 の場合、参照設定と参照先の .dll のバージョン不一致の問題は出なかったので気がつきませんでした。

参考までに、なぜ MVC4 では問題が出なかったかを以下に書いておきます。

Visual Studio 2010 のインターネットアプリケーションテンプレートで MVC4 アプリを作ると、アプリケーションルート直下の packages フォルダに System.Web.Mvc.dll ほか必要な .dll がコピーされます。(NuGet によるパッケージ管理のため?)

コピーされる .dll のバージョンは 4.0.0.0 で、当然ですが参照設定もそのバージョンになります。

Visual Studio で System.Web.Mvc のプロパティを見るとわかりますが、「ローカルコピー」が True に設定されているので、ビルドする時に bin フォルダに .dll がコピーされます。

Windows Update によって packages フォルダの .dll は書き換えられることはないので、参照設定と参照先(bin フォルダの .dll)のバージョンの不一致は起こらないという仕組みです。

なお、Windows Update 後に新たに MVC4 プロジェクトを作っても、使われる System.Web.Mvc.dll は 4.0.0.0 のままとなります(自動的に最新バージョンが参照されることはない)ので注意してください。

具体的に言うと、C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Assemblies の方の System.Web.Mvc.dll は 4.0.0.1 に更新されますが、C:\Program Files\Microsoft ASP.NET\ASP.NET MVC 4\Packages の方は 4.0.0.0 のままになり、プロジェクトの packages フォルダにコピーされるのは後者のフォルダにある 4.0.0.0 となるようです。

4.0.0.0 から 4.0.0.1 への更新が必要であれば、Visual Studio のテンプレートで Web アプリを作成後、NuGet のパッケージマネージャーを使って手動で行う(「NuGet パッケージの管理」を起動して、その中から「Microsoft ASP.NET MVC 4」を選択して更新をかける)必要があります。

Tags:

MVC

About this blog

2010年5月にこのブログを立ち上げました。その後 ブログ2 を追加し、ここは ASP.NET 関係のトピックス、ブログ2はそれ以外のトピックスに分けました。

Calendar

<<  November 2019  >>
MoTuWeThFrSaSu
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678

View posts in large calendar