web-dev-qa-db-ja.com

.Netが誤った参照アセンブリバージョンを選択

既存のプロジェクトを真新しいマシンにコピーして開発を開始しましたが、参照されているアセンブリの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でローカルに見つかると見つからないことです。

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

127
Michael La Voie

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

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

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

私はこれについてクリス・コンウェイと一緒です(彼を支持しました)。問題は、プロジェクト内のテレリックアセンブリの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>
24
NotMe

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

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

enter image description here

お役に立てれば。

21
RayLoveless

試してください:

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

それは私のために働いた。

6
Ronney Lira
  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"

アセンブリのコンパイル

私のために働く。

3

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

2
AspNetDev

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

2
warrickh

これは理由に関する明確な答えではありませんが、この問題が発生しました。状況とその解決策を次に示します。

開発1:

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

開発2:

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

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

2
Chris Moschini

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

1
brando

場合によっては他の人を3時間節約できます...私の場合は少し違っていました。私のコードはDevExpress v11.1 v11.1.4.0を使用しました。私はそれをすべてコードで正しく参照させました。しかし、.netメモリプロファイラーはGACにDevExpress v11.1 v11.1.12.0をインストールしました。実際、失敗したのは、私が参照したコンポーネントではなく、内部で参照したコンポーネントでした。試してみてください、GACは常に最初にチェックされます。コンパイルして正常に実行されましたが、勝利フォームデザイナーを見ることができず、スタックトレースはまったく役に立ちませんでした。最終的に.netメモリプロファイラーをアンインストールし、すべてが復元されました。

1
RichieRich

私が得ていた:

ファイルまたはアセンブリ 'XXX-new-3.3.0.0'またはその依存関係の1つをロードできませんでした。検出されたアセンブリのマニフェスト定義は、アセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)

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

1
mimo

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

1
Gedeon

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

1
Edd

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

enter image description here

0
crazyTech

私の場合、3つのプロジェクトがあり、1つのメインプロジェクトと、メインプロジェクトによって参照される2つのサブプロジェクトがありました。そこに紛争がありました。すべてのプロジェクトを更新した後、すべてが正常に機能しました。

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

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

0
Anonymous User

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

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

0
Carl Onager

たぶんこれは役立つかもしれません。デバッグバージョンとリリースバージョンを削除し、OBJフォルダーの名前を変更しました。これは最終的に私を徹底的にしました。前の手順は基本的にプロジェクトの参照を削除し、プロジェクトのプロパティでそれらを追加し直すことでした。

0
Tim

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

0
SQLKing

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

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

enter image description here

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

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

enter image description here

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

enter image description here

0
Ragavan Rajan

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

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

PlatformTargetがないため、このエラーが発生しました。

0
Ben