既存のプロジェクトを真新しいマシンにコピーして開発を開始しましたが、参照されているアセンブリの1つのバージョンで問題が発生しました(telerik DLLが発生します)。
このプロジェクトは元々、アセンブリの古いバージョンを参照していました(v1.0.0.0と呼びます)。私の新しいマシンには最新バージョンのアセンブリがインストールされているので、それを更新したと思いました(新しいバージョンをv2.0.0.0と呼びましょう)。
ここに問題があります:古いv1.0.0.0 dllをプロジェクトフォルダーにコピーして参照として追加すると、問題なくWebサイトが起動します。その参照を削除し(システムから古いDLLも削除し)、新しいバージョン(v2.0.0.0)を追加すると、ページに次の例外が表示されます。
ファイルまたはアセンブリ 'XXXXXX、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = 121fae78165ba3d4'またはその依存関係の1つをロードできませんでした。検出されたアセンブリのマニフェスト定義は、アセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)
明らかに、コードは古いバージョンを探しており、それを見つけることができません。しかし、なぜ?
そのバージョン番号のソリューションフォルダーを探しましたが、単一の参照が見つかりませんでした。 .csprojファイルのテキストを再確認したところ、バージョンが正しく最新バージョンを示し、HintPathが新しいDLLへのパスを正しく示していることがわかりました。さらに、古いDLLをシステムにインストールしなかったため、GACには表示されません(v2.0.0.0は予想どおりに表示されます)。
次に、Fusion Log Viewerを有効にして、なぜ古いバージョンを探しているのかを見つけようとしましたが、運はありません。
Assembly Load Trace: The following information can be helpful to determine why the Assembly 'XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4' could not be loaded.
=== Pre-bind state information ===
LOG: User = MyComp\me
LOG: DisplayName = XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
(Fully-specified)
LOG: Appbase = file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/
LOG: Initial PrivatePath = d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\bin
Calling Assembly : WebApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: d:\My Documents\Visual Studio 2010\Projects\CoolProj\WebApp\web.config
LOG: Using Host configuration file:
LOG: Using machine configuration file from C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: XXXXXX, Version=1.0.0.0, Culture=neutral, PublicKeyToken=121fae78165ba3d4
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX.DLL.
LOG: Attempting download of new URL file:///C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files/root/90233b18/10d54998/XXXXXX/XXXXXX.DLL.
LOG: Attempting download of new URL file:///d:/My Documents/Visual Studio 2010/Projects/CoolProj/WebApp/bin/XXXXXX.DLL.
WRN: Comparing the Assembly name resulted in the mismatch: Major Version
ERR: Failed to complete setup of Assembly (hr = 0x80131040). Probing terminated.
それは、古いアセンブリを探すことから始まると言っています。私はオンラインで解決策を見つけようとしましたが、これと同様の SOの質問 を見ましたが、それは私の問題の正反対のようです。その質問者のプログラムは、参照されたものの代わりに間違ったDLLを見つけていました。私の問題は、プログラムが間違ったDLLを不思議に探しており、正しいフォルダーがbinフォルダーとGACでローカルに見つかると見つからないことです。
なぜ古いバージョンを探しているのですか?この悪い参照を見つけるために他にどこで検索できますか?
私が推測しているのは、使用している別のアセンブリが古いdllを参照していることです。使用されている他のすべてのプロジェクト参照に精通しており、それらのいずれかがTelerik dllへの参照を持っていますか?
このようにweb.configファイルにバインディングリダイレクトを入れることはできますか?
<dependentAssembly>
<assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/>
<bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>
私はこれについてクリス・コンウェイと一緒です(彼を支持しました)。問題は、プロジェクト内のテレリックアセンブリの1つを参照しており、そこにない別のアセンブリを参照していることです。
まず、ベンダー(つまり、telerik)アセンブリをGACにインストールしません。とにかくTelerikのものは、たった2つのアセンブリ(telerik.web.designとtelerik.web.ui)にコンパイルされます。それらをアプリケーションにデプロイするだけです。
次に、各.projファイル(.csprojなど)に、Telerik.Web.UIファイルを指す<reference include..>
があります。通常、これにはバージョン番号が含まれます。 binフォルダーに配置したアセンブリがそのバージョンと一致することを確認してください。
第三に、すべてのプロジェクトが最新のアセンブリを使用していることを確認してください。また、GACではなくローカルパスからアセンブリを取得していることを確認してください。 (私は本当にGACが好きではありません。これまで行ってきたいくつかのプロジェクトで問題が発生することはありませんでした)。通常、すべてのプロジェクトが外部アセンブリ参照に使用する「アセンブリ」フォルダーがあります。
第4に、Webサイトプロジェクトが読み込まれるたびにVisual Studioが自動的にGACを検索し、GACで何かが見つかった場合はアセンブリの場所を再ターゲットします。 Webアプリケーションプロジェクトでこれを実行したことがあるかどうかは思い出せませんが、これらのプロジェクトで長い間問題を抱えていません。これにより、展開中に同様の問題が発生する可能性があります。
5番目に、web.configでアセンブリのバージョン番号を再バインドできます。 runtime/assemblybinding
セクションでは、次のようなものを使用できます。これは、2008年にデプロイされたすべてのtelerikアセンブリを前方に移動し、非常に特定のバージョンを指します。
<dependentAssembly>
<assemblyIdentity name="Telerik.Web.UI" publicKeyToken="121fae78165ba3d4" />
<bindingRedirect oldVersion="2008.0.0.0-2020.0.0.0" newVersion="2010.02.0713.35" />
</dependentAssembly>
私はほとんどの答えを試しましたが、それでもうまくいきませんでした。これは私のために働いた:
参照を右クリック-> プロパティ-> 「特定のバージョン」をfalseに変更
お役に立てれば。
試してください:
C:\Users\USERNAME\.nuget\packages\
にインストールされている古いバージョンのクリーニングそれは私のために働いた。
コンパイルアセンブリ
addassembly = dllName、Version = 1.0.0000.0000 Culture = neutral、PublicKeyToken = "QWEWQERWETERY"
アセンブリのコンパイル
私のために働く。
そのソリューションに他のプロジェクトがありますか?(別のプロジェクトが古いバージョンを参照している可能性があります)通常VSでは、dllの依存関係はソリューションのすべてのプロジェクトに及びます.
私の問題は、古いアセンブリがWebアプリケーションの下の_bin_deployableAssembliesフォルダーにあったことでした。これは、プロジェクトをビルドするときに古いアセンブリがGACアセンブリを上書きしていたことを意味します。
これは理由に関する明確な答えではありませんが、この問題が発生しました。状況とその解決策を次に示します。
開発1:
ソリューションには、NuGetパッケージを参照するプロジェクトAと、プロジェクトAを参照するMVCプロジェクトが含まれています。NuGetパッケージの復元を有効にして、NuGetパッケージを更新しました。 NuGetライブラリが見つからないことを訴えるランタイムエラーが発生しました-しかし、エラーは古い、更新されていないバージョンを探していることです。解決策(これはばかげている):プロジェクトAを呼び出すMVCプロジェクトのコードの最初の行にブレークポイントを設定します。F11でステップインします。解決済み-二度と問題はなかった。
開発2:
ソリューションとプロジェクトは同じですが、マジックセットブレークポイントとステップインソリューションは機能しません。このNugetパッケージへのバージョンリダイレクトまたはその他の不正な参照をあらゆる場所で探し、パッケージを削除して再インストールし、bin、obj、Asp.Net Tempを消去しましたが、何も解決しませんでした。最後に、プロジェクトAに名前を変更し、MVCプロジェクトを実行しました-修正済み。名前を元の名前に戻し、修正されたままです。
なぜそれが機能したのかについては説明がありませんが、深刻な問題から抜け出しました。
Newtonsoft.jsonの異なるバージョンを参照する異なるアセンブリで同じ問題が発生しました。私のために働いたソリューションは、Nuget Package Manager Consoleからupdate-packageを実行することでした。
場合によっては他の人を3時間節約できます...私の場合は少し違っていました。私のコードはDevExpress v11.1 v11.1.4.0を使用しました。私はそれをすべてコードで正しく参照させました。しかし、.netメモリプロファイラーはGACにDevExpress v11.1 v11.1.12.0をインストールしました。実際、失敗したのは、私が参照したコンポーネントではなく、内部で参照したコンポーネントでした。試してみてください、GACは常に最初にチェックされます。コンパイルして正常に実行されましたが、勝利フォームデザイナーを見ることができず、スタックトレースはまったく役に立ちませんでした。最終的に.netメモリプロファイラーをアンインストールし、すべてが復元されました。
私が得ていた:
ファイルまたはアセンブリ 'XXX-new-3.3.0.0'またはその依存関係の1つをロードできませんでした。検出されたアセンブリのマニフェスト定義は、アセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)
アセンブリの名前をXXX.dll
からXXX-new-3.3.0.0.dll
に変更したためです。名前を元に戻すと、エラーが修正されました。
Visual Studio環境(ASP.NET開発サーバー)からアプリケーションをテストまたはデバッグするときにこの問題が発生した場合は、開発Webサイトフォルダーのすべての一時ファイルを削除する必要があります。そのフォルダがどこにあるかを知るには、Windowsトレイアイコン(ASP.NET Development Server-Port ####のようなタイトルが必要です)でASP.NET Development Serverアイコンを探し、アイコンを右クリックしてShowを選択します詳細;そのため、[物理パス]フィールドに一時フォルダとは何かが表示されます。問題を解決するには、そこにあるすべてのアイテムを削除する必要があります。 Webサイトを再度ビルドして実行すると、問題が解決されます(これも開発環境で解決されます)。
私は同様の問題を抱えていたため、binフォルダーとobjフォルダーからすべてを削除し、問題を解決するために再構築する必要がありました。お役に立てれば。
私の場合、3つのプロジェクトがあり、1つのメインプロジェクトと、メインプロジェクトによって参照される2つのサブプロジェクトがありました。そこに紛争がありました。すべてのプロジェクトを更新した後、すべてが正常に機能しました。
これは私のために働いたものです:
クラスライブラリプロジェクトでMicrosoft.IdentityModel.Clients.ActiveDirectory
バージョン3.19を使用していましたが、実際のASP.NET Webアプリケーションプロジェクトにはバージョン2.22しかインストールされていませんでした。 Webアプリプロジェクトで3.19にアップグレードすると、エラーが発生しました。
同じDLLの異なるバージョンを参照するアプリケーションの2つのバージョン間で切り替えると、同じメッセージが表示されました。別のフォルダーでテストしていましたが、誤って古いバージョンの上に新しいバージョンをコピーしました。
そのため、最初に確認するのは、アプリケーションのフォルダー内で参照されているDLLのバージョンです。念のため。
たぶんこれは役立つかもしれません。デバッグバージョンとリリースバージョンを削除し、OBJフォルダーの名前を変更しました。これは最終的に私を徹底的にしました。前の手順は基本的にプロジェクトの参照を削除し、プロジェクトのプロパティでそれらを追加し直すことでした。
古いdllを取り除くためにコンピュータを一掃する必要があるようなものです。上記のすべてを既に試した後、コンピューターにある.DLLファイルのすべてのインスタンスを削除し、アプリケーションからすべての参照を削除するという追加の手順を実行しました。ただし、それでもコンパイルは正常に行われ、実行時にはdll関数が正常に参照されます。ネットワークドライブから参照しているのではないかと思い始めています。
このエラーはやや誤解を招くものでした-x64アーキテクチャを指定する必要があるDLLをロードしていました。 .csproj
ファイル内:
<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release-ABC|AnyCPU'">
<OutputPath>bin\Release-ABC</OutputPath>
<PlatformTarget>x64</PlatformTarget>
</PropertyGroup>
PlatformTarget
がないため、このエラーが発生しました。