VS2010で正常にコンパイルされるASP.NET MVC4プロジェクトがあります。展開の目的で、aspnet_compiler.exeを使用してWebサイトをプリコンパイルしようとするNantスクリプトを実行しますが、System.Web.WebPageでアセンブリ参照の問題が発生し続けます
エラーCS1705:アセンブリ「System.Web.Mvc、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35」は「System.Web.WebPages、Version = 2.0.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35」を使用します参照アセンブリ 'System.Web.WebPages、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35'よりも高いバージョン
また、web.configに次のアセンブリバインディングがあります。
<runtime>
<assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages.Razor" publicKeyToken="31bf3856ad364e35" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
私のcsprojには次の参照があります:
<Reference Include="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<Private>True</Private>
<HintPath>..\packages\AspNetWebPages.Core.2.0.20126.16343\lib\net40\System.Web.WebPages.dll</HintPath>
</Reference>
Web.configで2.0アセンブリを明示的に参照することにより、この問題を解決しました。何らかの理由で、ASP.NETコンパイラ(MvcBuildViews
を実行している場合)は、古い1.0アセンブリが見つかった場合、最初にそれを使用すると考えられます。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- … -->
<system.web>
<!-- … -->
<compilation debug="true" targetFramework="4.0">
<assemblies>
<add Assembly="System.Web.Mvc, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
<add Assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add Assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<add Assembly="System.Web.WebPages, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
</assemblies>
</compilation>
<!-- … -->
</system.web>
<!-- … -->
</configuration>
ところで:この問題は、サードパーティのASP.NET MVC 3.0コンポーネントを追加した後に初めて発生したように見えました。そのコンポーネントは、Assemblyバインディングを通じて正常に機能しますが、ASP.NETコンパイラーが最初に1.0 Webページをロードしようとする理由である可能性があります。
同様の問題がありました。
現在、開発にVisual Studio 2012を使用しており、2010プロジェクトを2012に変換して展開しようとしたときに、ASP.NETは1.0.0.0ではなく2.0.0.0を必要としていました。
調査の結果、プロジェクトがSystem.Web.WebPagesの特定のバージョンを参照していないことがわかりました。そのため、VS 2012にアップグレードした後、2.0.0.0バージョンが見つかりました。
プロジェクトから参照を削除してから、GACから特定のバージョンを再度追加すると、正常に機能します。
私たちにとって、問題は関連するDLLの_bin_deployableAssemblies
フォルダ。これを削除すると、2.0バージョンで正しく構成されました。
MVC 3から5.2.3.0にサイトをアップグレードするときにこの問題が発生しました。
私の問題は、TFSがパッケージおよび関連するDLLをNugetインストールから追加しないことでした。
ソリューションのパッケージフォルダーに次のフォルダーを手動で追加しました。
Microsoft.AspNet.Razor.3.2.3
Microsoft.AspNet.WebPages.3.2.3
Microsoft.Web.Infrastructure.1.0.0.0
コミットすると、ビルドサーバーに問題はなくなりました。
このエラーは、MvcBuildViews
がtrueに設定されている場合にも発生します。
「ソリューションのビルド」を使用してソリューション全体をビルドすると、常にこのエラーが発生することに気付きました。その時点で、MVCプロジェクトをすぐに単独でビルドした場合(プロジェクトを右クリックしてから[ビルド])、MVCプロジェクトは正常にビルドされます。
MVCプロジェクト自体のビルドは、依存するプロジェクトでビルドをトリガーしない限り成功するようです(つまり、それらは最新のものです)。ただし、「Build Solution」を使用したビルドは常にこのエラーで失敗します。
私にとっては、それはSystem.Web.WebPages.Administration v1.0.0.0
への言及でした。削除すると、すべてがWeb.configの調整なしで機能しました。
この問題が発生したとき、私はしばらく頭を悩ましました。最終的に、web.configの「ランタイム」セクションに次のセクションがあることに気付きました。
<runtime>
. . .
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.0" />
</dependentAssembly>
. . .
</runtime>
ご覧のとおり、これはアセンブリのバージョン2を指します。これは、web.configのsystem.web/compilation/assembliesセクションにもある次のコードと一致しません。
<add Assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
プロジェクトの参照で参照される実際のアセンブリは実際にv1.0.0.0であるため、上記のコードの最初のチャンクを次のように変更し、問題をすぐに修正しました。そもそも間違いがどのようにそこに到達したのか分かりません。
<runtime>
. . .
<dependentAssembly>
<assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-1.0.0.0" newVersion="1.0.0.0" />
</dependentAssembly>
. . .
</runtime>
参照System.Web.Mvcを削除して再追加する
私にとってこの問題は、Webプラットフォームインストーラーを介して最新バージョンの.NETに更新する購入を引き起こした可能性が高いですが、ASP.NET MVCの最新バージョンがインストールされていませんでした。 Web Platformインストーラーを使用してこれを更新すると、問題が修正されました。
参照に移動し、System.Web.Mvcバージョン4.0以上を検索して追加します。 System.web.mvc 4.0.0.1の参照を追加するだけで機能します。
古いmvcバージョンを削除することを忘れないでください。
このような場合、ソリューションのルートフォルダー内のすべてのファイルで'Find in Files'を実行する価値があります。
上記の例では、System.Web.WebPages, Version=1.0.0.0
この方法で、古いバージョンへのすべての参照を取り除くことができます。