.Netが間違った参照アセンブリバージョンを選択する


141

既存のプロジェクトを新しいマシンにコピーして開発を開始したところ、参照されているアセンブリの1つのバージョン(発生時にTelerik DLL)で問題が発生しました。

プロジェクトは元々古いバージョンのアセンブリを参照していました(v1.0.0.0としましょう)。新しいマシンには最新バージョンのアセンブリがインストールされているので、それを更新したと思った(新しいバージョンv2.0.0.0と呼ぶことにする)。

ここに問題があります:古いv1.0.0.0 dllをプロジェクトフォルダーにコピーして参照として追加すると、Webサイトは問題なく起動します。その参照を削除して(システムから古いDLLも削除して)新しいバージョン(v2.0.0.0)を追加すると、ページに次の例外が表示されます。

ファイルまたはアセンブリ 'XXXXXX、バージョン= 1.0.0.0、カルチャー=ニュートラル、PublicKeyToken = 121fae78165ba3d4'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。(HRESULTからの例外:0x80131040)

明らかに、コードは古いバージョンを探しており、それを見つけることができません。しかし、なぜ?

そのバージョン番号のソリューションフォルダーを探しましたが、1つの参照を見つけることができませんでした。.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を見つけていました。私の問題は、プログラムが不思議なことに間違ったDLLを探しており、適切なDLLがローカルにbinフォルダーとGACにある場合、それを見つけることができないことです。

なぜ旧バージョンを探しているのですか?この悪い参照を見つけるために他にどこを検索できますか?

回答:


151

私の推測では、使用している別のアセンブリが古いdllを参照していると思います。使用されている他のすべてのプロジェクト参照に精通していて、それらのうちのどれかがTelerik dllへの参照を持っていますか?

このようにweb.configファイルにバインディングリダイレクトを入れることはできますか?

<dependentAssembly>
 <assemblyIdentity name="Telerik" publicKeyToken="121fae78165ba3d4"/>
 <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0"/>
</dependentAssembly>

12
さまざまなバージョンがロードされている/されていない場合に、これと同様のすべての種類の問題が発生しました。C:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/Temporary ASP.NET Files / root / 90233b18 / 10d54998フォルダー内のすべてのファイルを手動で削除することもできます。場合によっては、Webサイトを再コンパイルするときに、一部のファイルロックが原因でASP.Netがそのフォルダーを削除できず、それらのdllが古い参照にぶら下がっている可能性があります。それは一撃の価値があります、私はそれが過去に私のためにうまくいったことを知っています。
Chris Conway、

1
あなたは私のために関連する問題を解決しました-ありがとう!C#アプリケーションの継承されたフォームは、古いバージョンの参照を探していたため、デザイナーで開くことができませんでした。問題の参照の古いバージョンを参照しているときに、元々作成されていた別の参照が判明しました。
Sam Skuce

2
構文について
迷っ

1
クリス、ありがとう!ここで私の問題を解決しました: stackoverflow.com/q/11490177/7850
Shaul Behr 2012

3
App.configまたはweb.configを調べて、既存の<dependentAssembly>エントリが問題の原因であるかどうかを確認することもできます 。
Roy Tinker 2013年

24

私はこれについてChris Conwayと一緒にいます(彼を支持しました)。問題は、プロジェクト内の存在しない別のアセンブリを参照しているプロジェクトのTelerikアセンブリの1つを参照していることです。

まず、GACにベンダ(つまり、telerik)のアセンブリをインストールしません。とにかく、Telerikのものは2つのアセンブリ(telerik.web.designとtelerik.web.ui)にコンパイルされます。それらをアプリケーションとともにデプロイするだけです。

次に、各.projファイル(.csprojなど)に<reference include..>、Telerik.Web.UIファイルを指すaがあります。通常、これにはバージョン番号が含まれます。binフォルダーに配置したアセンブリがそのバージョンと一致することを確認してください。

第3に、すべてのプロジェクトが最新のアセンブリを使用していることを確認してください。また、GACではなくローカルパスからアセンブリを取得していることも確認してください。(私は本当にGACが本当に好きではありません。私が携わってきたいくつかのプロジェクトで問題の終わりがありませんでした)。通常、すべてのプロジェクトが外部アセンブリ参照に使用する「アセンブリ」フォルダがあります。

4番目に、Visual Studioは、Webサイトプロジェクトが読み込まれるたびに自動的に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>

2
私は「感じる」ことを意味しました、それは今何ヶ月もの間私を悩ませてきました:)
マイケル・ラ・ボワ2011

21

ほとんどの回答を試しましたが、うまくいきませんでした。これは私のために働きました:

参照を右クリック -> プロパティ -> 「特定のバージョン」をfalseに変更します。

ここに画像の説明を入力してください

お役に立てれば。


30
それが+1投票の意味です。
xr280xr 2014年

7
しかし、単純な賛成投票が、満足度が高く、安心した答えがあなたをどれだけ満足させるかを十分に要約していない場合もあります。 、あなたが以前に試したものとは異なる答えに出会い、ブーム!それは今働きます!結局のところ、場合によっては、単に[上へ]ボタンを押しただけでは、圧倒的な感じに正直にならないことがあります。
Michael Plautz

7

試してください:

  • 一時プロジェクトファイルのクリーニング
  • ビルドおよびobjファイルのクリーニング
  • インストールされている古いバージョンのクリーニング C:\Users\USERNAME\.nuget\packages\

それでうまくいきました。


1
C:\ Users \ USERNAME \ .nuget \ packages \ディレクトリのクリーニングは、私が欠けていたものでした。どうもありがとう!
Herdo、2017

クリーンな古いnugetバージョンの場合は、Windowsベースのコンピューターで「開始」をクリックして「実行」を検索し、「%userprofile%\。nuget \ packages」をコピーして貼り付けます。これにより、nugetバージョンフォルダーが開きます
E.Meir

3
  1. C:\ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIGに移動します
  2. machine.configファイルを見つける
  3. メモ帳で開く
  4. 競合DLLを見つける
  5. これを削除して保存します。

コンパイルアセンブリ

addassembly = dllName、Version = 1.0.0000.0000 Culture = neutral、PublicKeyToken = "QWEWQERWETERY"

アセンブリのコンパイル

私のために働く。


2
私はこの悪夢も発見し
ました-GAC

3

これは理由について明確な答えではありませんが、この問題がありました。ここに私たちの状況とそれを解決した理由があります:

開発1:

ソリューションには、NuGetパッケージを参照するプロジェクトA、およびプロジェクトAを参照するMVCプロジェクトが含まれています。NuGetパッケージの復元を有効にしてから、NuGetパッケージを更新しました。NuGet libが見つからないことを訴えるランタイムエラーが発生しましたが、エラーは、更新されていない古いバージョンを探していることです。解決策(これはばかげています):プロジェクトAを呼び出すMVCプロジェクトのコードの最初の行にブレークポイントを設定します。F11でステップインします。解決済み-二度と問題はありませんでした。

開発2:

同じソリューションとプロジェクトですが、マジックセットブレークポイントとステップインソリューションは機能しません。このNugetパッケージへのバージョンリダイレクトやその他の不正な参照がないか、あらゆる場所を探し、パッケージを削除して再インストールし、bin、obj、Asp.Net Tempをワイプしましたが、何も解決しませんでした 最後に、プロジェクトAに名前が変更され、MVCプロジェクトが実行されました-修正されました。名前を元の名前に戻し、修正されました。

なぜそれが機能したのかについての説明はありませんが、それは私たちを深刻な一瞬から抜け出しました。


2

そのソリューションに他のプロジェクトがありますか?(別のプロジェクトが古いバージョンを参照している可能性があります)通常、VSでは、dll依存関係はソリューションのすべてのプロジェクトにまたがっています。


ソリューションの他のプロジェクトや、telerikを参照する他の参照DLLはありません。私はMSのDLL ALAシステムを参照しています*。
マイケル・ラVoieは、

2

私の問題は、古いアセンブリがWebアプリケーションの下の_bin_deployableAssembliesフォルダーにあったことでした。これは、プロジェクトのビルド時に古いアセンブリがGACアセンブリを上書きしていたことを意味します。


2

場合は他の誰かを救う3時間です...私の場合は少し異なっていました。私のコードはDevExpress v11.1 v11.1.4.0を使用しました。私はそれをすべてコードで正しく参照しました。しかし、.netメモリプロファイラーはDevExpress v11.1 v11.1.12.0をGACにインストールしました。実際、私が参照したコンポーネントではなく、内部で参照したコンポーネントが失敗しました。私が思うに、GACは常に最初にチェックされます。コンパイルして問題なく実行できましたが、winフォームデザイナを表示できず、スタックトレースはまったく役に立ちませんでした。最後に.netメモリプロファイラーをアンインストールし、すべて復元しました。


2

私にも同様の問題があり、binとobjフォルダーからすべてを削除し、問題を回避するために再構築する必要がありました。お役に立てれば。


1

Visual Studio環境(ASP.NET開発サーバー)からアプリケーションをテストまたはデバッグするときにこの問題が発生する場合は、開発Webサイトフォルダーのすべての一時ファイルを削除する必要があります。そのフォルダーの場所を確認するには、Windowsトレイアイコン(ASP.NET開発サーバー-ポート####のようなタイトルが付いているはずです)でASP.NET開発サーバーアイコンを探し、アイコンを右クリックして[表示]を選択します。詳細; 次に、[物理パス]フィールドで一時フォルダーがわかります。問題を解決するには、そこにあるすべてのアイテムを削除する必要があります。Webサイトを再度ビルドして実行すると、問題は解決されます(ここでも、開発環境で解決されます)。


1

Newtonsoft.jsonの異なるバージョンを参照する異なるアセンブリで同じ問題が発生しました。私にとってうまくいった解決策は、Nuget Package Manager Consoleからupdate-packageを実行することでした。


1

このエラーはやや誤解を招くものでした。x64アーキテクチャを指定する必要があるDLLをいくつかロードしていました。で.csprojファイル:

<PropertyGroup Condition="'$(Configuration)|$(Platform)' == 'Release-ABC|AnyCPU'">
    <OutputPath>bin\Release-ABC</OutputPath>
    <PlatformTarget>x64</PlatformTarget>
</PropertyGroup>

欠落PlatformTargetがこのエラーの原因です。


1

私は得ていました:

ファイルまたはアセンブリ 'XXX-new-3.3.0.0'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。(HRESULTからの例外:0x80131040)

私はからのアセンブリの名前を変更したためそれはだったXXX.dllXXX-new-3.3.0.0.dll。名前を元に戻すとエラーが修正されました。


はい-ソース管理での命名の問題を回避するために、共通アセンブリライブラリの名前にバージョンを含めました。名前を元に戻し、参照/ヒントパスを手動で更新すると、すべて機能しました。
Mathew Paxinos

0

そのほとんどは、古いdllを取り除くためにコンピューターを一掃する必要があるようです。私はすでに上記のすべてを試しましたが、コンピューターにあった.DLLファイルのすべてのインスタンスを削除し、アプリケーションからすべての参照を削除するという追加の手順を実行しました。ただし、それでも問題なくコンパイルされ、実行時にdll関数を正常に参照しています。ネットワークドライブから参照しているのではないかと思い始めています。


0

同じDLLの異なるバージョンを参照するアプリケーションの2つのバージョンを切り替えると、同じメッセージが表示されました。別のフォルダでテストしていましたが、誤って新しいバージョンを古いバージョンにコピーしました。

したがって、最初に確認するのは、アプリケーションのフォルダー内の参照先DLLのバージョンです。念のため。


0

多分これは役立つか、そうでないかもしれません。デバッグバージョンとリリースバージョンを削除してから、OBJフォルダーの名前を変更しました。これでようやく頭がよくなりました。前の手順は、基本的にプロジェクトの参照の削除とプロジェクトのプロパティでの参照の追加でした。


0

私のVisual Studio 2015では、問題のあるVisual Studioプロジェクトの参照パスリストが空であることを確認しました。

ここに画像の説明を入力してください


2つの異なる質問にまったく同じ答えを投稿しましたか?
AK47

0

これは私のために働いたものです:

Microsoft.IdentityModel.Clients.ActiveDirectoryクラスライブラリプロジェクトでバージョン3.19 を使用していましたが、実際のASP.NET Webアプリケーションプロジェクトにはバージョン2.22しかインストールされていませんでした。Webアプリプロジェクトで3.19にアップグレードすると、エラーが発生しなくなりました。


0

私の場合、3つのプロジェクトがあり、1つのメインプロジェクトと2つのサブプロジェクトがメインプロジェクトによって参照されていました。それは紛争があった場所です。すべてのプロジェクトを更新した後、すべてうまくいきました。


0

VS2017では、上記のソリューションをすべて試しましたが、何も機能しません。バージョン管理にはAzure devopsを使用しています。

  1. チームエクスプローラーから>ソース管理エクスプローラー

ここに画像の説明を入力してください

  1. 長い間あなたを狂わせるプロジェクトを選択してください

  2. ブランチまたはソリューションを右クリック>詳細>特定のバージョンを取得

ここに画像の説明を入力してください

  1. 次に、スクリーンショットのようにファイルを上書きするチェックボックスをオンにしていることを確認します

ここに画像の説明を入力してください


0

私の場合、誤ってnugetから間違ったバージョンのTelerikパッケージを選択しました。これにより、nugetは、参照しているすべてのパッケージを誤ったバージョンで置き換えました。次に、不適切なバージョンへのバインディングリダイレクトを挿入したため、すべてを正しいバージョンで置き換えた後でも、誤ったバージョンを探していました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.