12

Lucene.netとLucene.netContribをC#MVC3に追加した後、最初の実行が成功した後、以下のメッセージが表示されます。このエラーを受け取った後、プロジェクトを再度実行する前に、C:\ Users \ Me \ AppData \ Local \ Temp \TemporaryASP.NETファイルを完全に消去する必要があります。

Luceneファイル(プロジェクト内の参照を含む)を手動で削除し、NuGetと手動の両方で再インストールしようとしましたが、常に同じ状況です。プロジェクトを1回実行すると、次のエラーが発生し始めます。

注:Contrib.RegexはLucene.netContribの一部です。

Server Error in '/' Application.

Could not load types from assembly Contrib.Regex, Version=2.9.4.0, Culture=neutral, PublicKeyToken=85089178b9ac3181, errors:
Exception: System.IO.FileLoadException: Could not load file or assembly 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181'

=== Pre-bind state information ===
LOG: User = rcw7\Me
LOG: DisplayName = Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181
(Fully-specified)
LOG: Appbase = file:///C:/Development/Projects/Foobar/Foobar/
LOG: Initial PrivatePath = C:\Development\Projects\Foobar\Foobar\bin
Calling assembly : Contrib.Regex, Version=2.9.4.0, Culture=neutral, PublicKeyToken=85089178b9ac3181.
===
LOG: This bind starts in default load context.
LOG: Using application configuration file: C:\Development\Projects\Foobar\Foobar\web.config
LOG: Using host configuration file: C:\Users\Me\Documents\IISExpress\config\aspnet.config
LOG: Using machine configuration file from C:\Windows\Microsoft.NET\Framework\v4.0.30319\config\machine.config.
LOG: Post-policy reference: Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181
LOG: Attempting download of new URL file:///C:/Users/Me/AppData/Local/Temp/Temporary ASP.NET Files/root/e9b4cfa4/edfa73f8/Lucene.Net.DLL.
WRN: Comparing the assembly name resulted in the mismatch: Revision Number
ERR: Failed to complete setup of assembly (hr = 0x80131040). Probing terminated.
Exception: System.IO.FileLoadException: Could not load file or assembly 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)
File name: 'Lucene.Net, Version=2.9.4.1, Culture=neutral, PublicKeyToken=85089178b9ac3181'

ここに完全な出力:http://pastebin.com/Vbu4VK7B

当初、これは開発環境のローカルな問題だと思っていましたが、プロジェクトを再構築してサーバーにコピーした後、同じエラーが発生します。

これを克服する方法として何か提案はありますか?:-)

4

4 に答える 4

7

結局のところ、DLL地獄は、構成とコンパイルされたライブラリの私自身の干渉によって引き起こされたのではありません。実際、これは、新しくダウンロードしたバージョンのLucene.NETと、Examineにバンドルされているやや古いバージョン(Umbraco 5にバンドルされているバージョン)との衝突が原因でした。

どうやら、古くてバンドルされたLucene.NETはシャドウキャッシュ(一時ASP.NETファイル)に入れられていたため、次のコンパイルまたはIISの再起動後、実行が中断していました。シャドウキャッシュをクリアすると、1回の実行が成功します。

奇妙なことに、ディレクトリパスまたはバージョン番号のいずれかを使用して、古いバージョンのLucene.NETを示唆するデバッグ出力のどこにも参照が見つかりませんでした。この問題は、Lucene.NETのシャドウコピーバージョンと使用する予定のバージョンのファイルサイズを比較することで発見されました。それらはオフだったので、Lucene.NET.dllを検索して、Umbracoツリー(\ App_Plugins \ Examineの下)でExamineにバンドルされているものを見つけました。

迅速な解決策は、Examineプラグインを圧縮するだけだったので、Umbracoはそれを認識しませんでした。そのため、Examineプラグインがなくなりましたが、とにかく使用していませんでした。

正しい解決策は、おそらく以前のバージョンのLucene.NETを無視するようにアプリに指示することですが、これまでのところうまくいきませんでした。これは私がweb.configに追加したものです:

<dependentAssembly>
    <assemblyIdentity name="Lucene.Net" publicKeyToken="85089178b9ac3181" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-2.9.4.1" newVersion="2.9.4.1" />
</dependentAssembly>

これは効果がないようで、古いバージョンはまだシャドウキャッシュに残っていました。この質問をここに移動しました:Umbraco 5にバンドルされた(Examineを使用した)Lucene.NETを無視させるにはどうすればよいですか?

あなたの助けと提案に感謝します-それは私を正しい方向に向けました!:-)

于 2012-04-26T11:29:42.993 に答える
3

これは通常、GACに異なるバージョンのファイルがあり、ビンにあるファイルが別のバージョンであることを意味します。つまり、アプリケーションはバージョンを指していて、別のバージョンを見つけています。混乱しつつあります。あなたがしたいのはLucene.netをアンインストールすることです。アンインストール後、c:\ windows \ assemblyフォルダーを調べて、そこにLuceneファイルがないことを確認します。ある場合は、右クリックしてアンインストールします。その後、再度インストールできます。

于 2012-04-24T12:43:58.603 に答える
3

アセンブリのmanifest definition does not match解決に問題があることを意味します。 このSOの質問を参照してください

[編集]

アセンブリはGACから読み込まれ、次にアプリケーション内のlib / binディレクトリ、次に<HintPath>プロジェクトで指定されたディレクトリから読み込まれます。あなたが持っていることを確認してください

Specific Version = TrueCopy Local = True

参照のプロパティウィンドウで。

アプリケーション内のプライベートパス(lib / binディレクトリ)からのアセンブリだけがシャドウコピーされます。Lucene.NETコアがシャドウコピーされていないのに、Contrib.Regexがシャドウコピーされている可能性があります。

[/編集]

ワイプするディレクトリASP.NET Temporary Filesは、シャドウコピーディレクトリです。このアセンブリのコピー方法に問題がある可能性があります。これは、ドメインアカウントのアクセス許可である可能性があります。ここで説明するように、シャドウコピーディレクトリを変更するか、シャドウコピーを完全にオフにすることで、この理論をテストできます。

https://stackoverflow.com/a/2847495/151445で説明されているように、Application_Startでこのディレクトリを変更でき ます

web.configでシャドウコピーをオフにできます。

<hostingEnvironment shadowCopyBinAssemblies="false" />

于 2012-04-24T12:55:40.877 に答える
2

Fusion Log Viewerを使用して、この問題を診断できます。ここで報告したものと同様に、ロードに失敗したタイプの完全な詳細が表示されます。お役に立てれば。

于 2012-04-24T12:53:46.043 に答える