4

このエラーが発生しています。

コンパイル エラーの説明: この要求を処理するために必要なリソースのコンパイル中にエラーが発生しました。次の特定のエラーの詳細を確認し、ソース コードを適切に変更してください。

コンパイラ エラー メッセージ: CS1704: 同じ単純名 'MyMVCAssembly、Version=1.0.0.0、Culture=neutral、PublicKeyToken=null のアセンブリが既にインポートされています。参照の 1 つを削除するか、署名して、side-by-side を有効にしてください。

私のソリューションには 2 つの ASP.Net MVC プロジェクトがあり、メイン コンテンツとエリアを分割しています。メイン プロジェクトには、2 番目のプロジェクトへの参照がありません。代わりに、フォルダー内のすべての MVC DLL を取得し、それを IOC コンテナーに格納します。これにより、すべてのコントローラーが登録されます。

2 番目の ASP.Net MVC プロジェクトの出力をメイン プロジェクトの bin フォルダーに設定すると、エラーが発生します。(私は Areas ソリューションのすべてのビューを常にコピーするように設定しました。)

出力を設定する代わりに、DLL をメイン ビンにコピーするビルド後のアクションも試しましたが、結果は同じです。

私は何をすべきか?


さらに、次の設定があります。

  1. VS Dev サーバーの代わりにローカル IIS サーバーを使用するように設定されています。
  2. [出力] ウィンドウで、ローカル Web サーバーが GAC および一時 ASP.Net ファイル フォルダーからすべての DLL をロードしていることがわかります。問題は、Solutions フォルダーから DLL ファイルをロードしようとしているということです。

ソリューションからもその唯一の DLL を取得しようとする理由はありますか? 他のプロジェクトではその動作はありません。


アップデート:

ここに奇妙な振る舞いがあります:

[1] 問題のあるアセンブリのすべてのコピーを消去します。

[2] そのアセンブリをメインの MVC プロジェクトの bin フォルダーにコピーするビルド後のアクションを削除しました。

[3] メイン プロジェクトを実行します。問題なく動作しますが、もちろん、不足しているアセンブリは読み込まれません。

[4] そのアセンブリを mian MVC プロジェクトの bin フォルダーに手動でコピーします。

[5] ソリューションを実行します。再びエラーが発生しています!

このまったく同じアセンブリを2つの異なる場所からロードしようとしている理由を誰かが説明できますか?

これは問題の手がかりになるかもしれません。アセンブリをメイン MVC プロジェクトの bin フォルダーにコピーしているため、Temporary ASP.NET フォルダーにもコピーされています。同時に、プロジェクトはソリューション内の他のプロジェクトから参照されていないため、同じアセンブリを IIS にコピーしています。どうすればこれを防ぐことができますか? アセンブリをメインの MVC ビンにコピーする手順を除外すると、アセンブリは IIS にまったく読み込まれません。なぜそのように振る舞うのですか?

4

2 に答える 2

1

このエラーは、問題のアセンブリに厳密な名前がなく、署名されていないため、コンパイラがメタデータでそれらを区別する方法がないため、2 つの参照が同じアセンブリ ID を持っていることを示しています。したがって、ランタイムは、バージョンとカルチャ アセンブリ名のプロパティを無視します。ユーザーは冗長な参照を削除するか、いずれかの参照の名前を変更するか、それらに厳密な名前を付ける必要があります。

以下のように説明できます。

以下のサンプルでは、​​アセンブリを作成し、ルート ディレクトリに保存します。

// CS1704_a.cs
// compile with: /target:library /out:c:\\cs1704.dll
public class A {}

以下のサンプルでは、​​前のサンプルと同じ名前のアセンブリを作成しますが、別の場所に保存します。

// CS1704_b.cs
// compile with: /target:library /out:cs1704.dll
public class A {}

以下のサンプルでは、​​両方のアセンブリを参照しようとしています。次のサンプルではCS1704が生成されます。

// CS1704_c.cs
// compile with: /target:library /r:A2=cs1704.dll /r:A1=c:\\cs1704.dll
// CS1704 expected
extern alias A1;
extern alias A2;

アップデート

両方のアセンブリに厳密な名前が付けられている (署名されている) 場合、CLR は常に GAC から読み込まれます。

以下の手順に従うことができます:

  1. アプリケーション構成ファイル、パブリッシャー ポリシー ファイル、コンピューター構成ファイルなど、該当する構成ファイルを調べて、正しいアセンブリ バージョンを判断します。構成ファイルがリモート マシンにある場合、ランタイムは最初にアプリケーション構成ファイルを見つけてダウンロードする必要があります。

  2. アセンブリ名が以前にバインドされているかどうかを確認し、バインドされている場合は、以前に読み込まれたアセンブリを使用します。アセンブリを読み込む前の要求が失敗した場合、要求はアセンブリを読み込もうとせずにすぐに失敗します。

  3. グローバル アセンブリ キャッシュをチェックします。アセンブリが見つかった場合、ランタイムはこのアセンブリを使用します。

  4. アセンブリのプローブ (詳細については、以下の記事を参照してください)

詳細については、ランタイムがアセンブリを検索する方法を確認してください

これがお役に立てば幸いです。

于 2013-01-13T16:54:08.373 に答える