8

私の C# プロジェクト (SuperUI と呼びます) では、外部アセンブリのクラスを使用していました。現在はそうではありませんが、アセンブリ参照が配置されていないと、コンパイラはプロジェクトをビルドできません。詳しく説明しましょう。

SuperExceptionこのプロジェクトは、標準の System.Exception から派生したカスタム例外クラスをスローしてキャッチしていましたSuperAssembly.DLL

最終的に、これは無意味な作業であると判断し、すべてSuperExceptionsをそれぞれ System.SuitableStandardException に置き換えました。への参照を削除しましたSuperException.DLLが、プロジェクトをコンパイルしようとすると、次のようになります。

タイプ 'SuperException' は、参照されていないアセンブリで定義されています。アセンブリ 'SuperException, Version=1.1.0.0 (...)' への参照を追加する必要があります

エラーで参照されているソース ファイルは関連していないようです。IDE で強調表示されるのは、プロジェクトの名前空間です。

さて、ここにあります:

  1. のすべての使用はSuperException、プロジェクトのコードから削除されました。
  2. への参照なしで正常にコンパイルされる別のプロジェクトと比較してSuperException.DLL、私はもう 1 つのアセンブリのみを参照thatし、プロジェクト自体が参照していないものは何も参照していません。これらの依存関係のいずれかがスローされる可能性はありますがSuperExceptions、基本の Exception クラスのみをキャッチしているため、いずれにせよ...他のプロジェクトは正常にビルドされます!
  3. 私は Visual Studio の「クリーン ソリューション」を実行し、すべてを手作業で何度もクリアしました。

この参照を含めることは世界の終わりではありません。なぜそれが必要なのかわかりません. うーん。どんなポインタでも大歓迎です!

4

14 に答える 14

2

これはコードの問題ではないと思います。私が見ていることは、既存の参照の1つが、おそらくアプリケーションで作成している独自の型のその型に依存していることです。

その場合、型を明示的に使用していなくても、また他の参​​照されているアセンブリに独自の参照がある場合でも、その参照が必要です。参照していない型への参照を必要とするサードパーティコンポーネントでこの問題が発生することがあります。コンパイラは明らかに、既存の参照アセンブリの1つで何かを認識しており、依存アセンブリを参照することを期待しています。

于 2008-08-21T14:11:02.750 に答える
2

ここの他のコメントに同意します.どこかにプレーンテキストで参照があります! 過去に同様の問題があり、プロジェクト ファイルを検索しても何も返されず、検索で自動的に検出されなかった他のファイルにあったことが判明しました。

新しいプロジェクトを作成することがここでの解決策だとは思いません.依存関係ツリーの参照のどれもが SuperException を使用していないことを確認する必要があります..NONE

文字通りプロジェクトを一掃する必要があるという点までこれを経験したことはありません。常にどこかで参照を見つけました。すべてのファイルを検索していることを確認してください。

編集:

エラーが指している場所がランダムに見える場合は、コンパイルされたソースとソース コード ファイルの間に不一致があることを意味することがよくあります。これは ASP.NET アプリケーションですか? 私はコンパイルされたDLLがASP.NET一時フォルダーの再構築で置き換えられていない場所で、物事を取得する前にそれを持っていました..デバッグ時に興味深い:)

于 2008-08-12T21:41:46.053 に答える
2
  1. Visual Studio を終了する
  2. ソリューション ディレクトリの bin および obj フォルダーを削除します。
  3. 再起動して何が起こるか見てみましょう
于 2008-08-12T19:56:41.227 に答える
1

これまでのご回答ありがとうございます。私はすべての提案(1つを除く)を試しましたが、役に立ちませんでした。

私が試したことのない提案は、新しいプロジェクトを作成し、それに自分のすべてのものを追加することです。その考えは、私の生きる意志を実際にテストします. ;) 気になるなら、明日これを試すかもしれません。再度、感謝します。

于 2008-08-12T20:38:39.597 に答える
1

今日の VS プロジェクトについて、特に不思議なことは何もありません。それはすべてテキスト ファイルなどです。

その例外への参照のために、ソリューション ツリー全体、すべてのファイルを本当に grep したり、findstr したりしましたか?

于 2008-08-12T20:46:22.763 に答える
1

これはコンパイラ エラーであるため、プロジェクトのどこかで SuperException の参照または使用が存在する必要があります。

  1. そのタイプのプロジェクトまたはソリューション全体で検索/置換を実行し、すべての参照を削除します (既にこれを行っている可能性があります)。
  2. SuperException から継承する型を参照する場合 (型が別のアセンブリで定義されている場合でも)、SuperException が定義されているアセンブリへの参照が必要です。

コンパイラがエラーを表示している行を取り、その行で使用されているオブジェクトの継承ツリーのトレースを開始すると、そのソースを見つけることができます。

于 2008-08-12T19:48:52.287 に答える
0

SuperException から継承する型を参照する場合 (型が別のアセンブリで定義されている場合でも)、SuperException が定義されているアセンブリへの参照が必要です。

それに出向した。

を参照していない可能性がありますが、から派生した、または何らかの方法で使用している を参照しSuperExceptionている可能性があります-プロジェクトのgrepはそれをキャッチしません。SpecializedSuperExceptionSuperExceptionSuperException

NDependのお試しでハックしてみる

于 2008-08-12T21:49:16.070 に答える
0

プロジェクトフォルダーをgrepします。プロジェクト内の非表示の参照、またはプロジェクトが参照するプロジェクトである可能性があります。必要に応じてメモ帳でクレンジングします。

于 2008-08-12T20:06:20.740 に答える
0

私の C# ライブラリに依存する C++/CLI アセンブリがあったときに、非常によく似たアセンブリ参照の問題が発生しました。問題は、C# アセンブリ ライブラリの C++/CLI アセンブリからパブリック クラスを継承していたことです。つまり、継承チェーンが複数のアセンブリにまたがっていました。

C# ライブラリが必要とするときはいつでも C++/CLI アセンブリを間接的にロードできるほどスマートなクライアントを期待していましたが、コンパイル時にもそうではありませんでした。

これら 2 つのアセンブリ ライブラリにまたがるクラス間の継承を解除し、代わりに集約を使用することで、この問題を解決しました。私のクライアントは最終的に満足し、C++/CLI アセンブリを依存関係として必要としなくなりました。

あなたの言葉では、リファレンスとしてのを排除するために、それSuitableStandardExceptionが継承されていないことを確認する必要があるでしょう。SuperExceptionSuperException.DLL

継承の代わりにカプセル化を使用SuperExceptionし、 new にデータ メンバーを作成します SuitableStandardException

それでも解決しない場合は、いくつかのアセンブリにまたがる継承にまたがるクラスがさらにある可能性がありSuperAssembly.DLLますsuperException.dll

それらのすべてを見つけることができない場合は、次のトリックを試してください。

  1. すべてのパブリック メンバーとクラスをSuperAssembly.DLLinternal にします。

  2. SuperAssembly.DLL で、次のように友達を作りますSuperException.DLL

    [assembly:InternalsVisibleTo("SuperException, PublicKey=0024000004800000....)]
    
  3. SuperAssembly.DLL既に を参照しているすべてのクライアントから参照を作成および削除するようにしてくださいSuperException.DLL

于 2011-04-22T21:10:18.867 に答える
0

これはかなり奇妙に聞こえます。次に確認するのは次のとおりです。

  1. Properties/AssemblyInfo.cs ファイルに何も残っていないことを確認します。
  2. SuperUI.csproj ファイルに何も残っていないことを確認します。
  3. すべての参照を削除して、再度追加します。
于 2008-08-12T19:46:51.403 に答える
0

新しいプロジェクトを作成し、すべてのクラスをそれに追加してみてください。

于 2008-08-12T19:51:10.737 に答える
0

これは、Resharperのようなツールが真価を発揮する場所です。単純な Find Usages は、通常、そのような「ゴースト依存関係」を何度か教えてくれます。

おそらく、SuperException クラスの定義に移動して、Find All References() を試すことができます。また、アセンブリ SuperException がメイン アセンブリに循環依存しているかどうかを調査することもできます (たとえば、メイン アセンブリは例外アセンブリに依存し、メイン アセンブリに依存します...)。

于 2008-08-13T01:05:29.980 に答える
-1

grep -R SuperException *grep念のため、プロジェクトのベースで(最初にどこかから入手してください)。

于 2008-08-13T00:29:42.343 に答える