タイプは参照されていないアセンブリで定義されていますが、原因を見つける方法は?


83

エラーメッセージが一般的であり、このエラーについてSOに関する質問がたくさんあることは知っていますが、これまでのところ解決策がないため、質問することにしました。同様の質問のほとんどとの違いは、App_Codeディレクトリを使用していることです。

エラーメッセージ:

CS0012: The type 'Project.Rights.OperationsProvider' is defined in an
assembly that is not referenced. You must add a reference to assembly
'Project.Rights, version=1.0.0.0, Culture=neutral, PublicKeyToken=null'.

ソースファイル:

c:\inetpub\wwwroot\Test\Website\App_Code\Company\Project\BusinessLogic\Manager.cs

ここここの提案に従って、C:\ Windows \ Microsoft.NET / *。*内のProject.Rights.dllのすべてのインスタンスを削除しました。これによると、問題の.csファイルのビルドアクションが「コンパイル」に設定されているかどうかを確認しました。 。彼らはそうします。また、「Project.Rights.OperationsProvider」タイプを含む.csファイルがApp_Codeディレクトリにデプロイされていることを再確認しました。

何らかの理由で、アプリケーションはApp_Codeディレクトリでタイプを検索していません。Project.Rights.dll(私が知っている)のすべてのインスタンスを削除したので、エラーメッセージがどのアセンブリに言及しているかわかりません。


6
Project.Rights.OperationsProviderタイプのメソッド/プロパティ/何かを公開するクラス(たとえばA)を使用しています。コンパイラはそれが何であるかを知る必要があり、それからそのアセンブリ(Project.Rights)を検索します。それが見つからない場合(Webサイトプロジェクトに参照がないため)...このエラーが発生します。解決策:そのアセンブリをシステムから削除しないでください!!! それへの参照を追加します。
アドリアーノレペッティ2013

2
ツール-オプション-プロジェクトとソリューション-ビルドと実行-両方の詳細度を詳細に設定してみてください。これにより、依存関係とは何か、コンパイラーがそれを探している場所がわかります。
danludwig 2013

回答:


99

このエラーが発生した場合、何が起こっているのかが常に明らかであるとは限りませんが、エラーが示すように、参照が欠落しています。例として、次のコード行を取り上げます。

MyObjectType a = new MyObjectType("parameter");

見た目はとてもシンプルで、おそらく「MyObjectType」を正しく参照しているはずです。しかし、「MyObjectType」コンストラクターのオーバーロードの1つが、参照していない型をとるとしましょう。たとえば、次のように定義された過負荷があります。

public MyObjectType(TypeFromOtherAssembly parameter) {
    // ... normal constructor code ...
}

これは、このエラーが発生する少なくとも1つのケースです。したがって、タイプを参照しているが、そのタイプで呼び出される関数で可能なプロパティまたはメソッドパラメータのすべてのタイプではないこのタイプのパターンを探します。

うまくいけば、これは少なくともあなたが正しい方向に進むようになるでしょう!


16
拡張メソッドに関する注意:2つのクラスに同じ名前の拡張メソッドがある場合、あるタイプのパラメーターが別のタイプの拡張メソッドの使用に「感染」する可能性があります。
アタリ2014

@Athariありがとう、私はそれを理解できなかったでしょう
DaveCousineau18年

しばらく見てから、この答えを偶然見つけました。これはまさに私の問題であり、あなたの説明は非常に役に立ちました。たくさんありがとう。
ダイアン

1
しかし、参照でコンストラクターを使用したくない場合はどうなりますか?参照を追加せずに、他のものを使用したいと思います。これは可能であるように思われます。
RobertIagar19年

1
これは本当に奇妙に思えますが、アセンブリ名の1つの場合に不一致があったため(nugetでは大文字と小文字が区別されたように見えますか?)、このエラーが発生しました。ライブラリCがライブラリBとAを参照していました。ライブラリBもライブラリAを参照していましたが、依存関係として「A」ではなく「a」という名前を使用してAをパッケージ化しました。ライブラリCをビルドしていると、Bの依存関係の名前を修正するまで、このエラーが発生し続けました。
トル

49

プロジェクトのターゲットフレームワークを確認します。

私の場合、「アセンブリへの参照を追加する必要があります」とは、実際には、呼び出し元と参照プロジェクトが同じターゲットフレームワークを持っていなかったことを意味します。呼び出し元のプロジェクトには.Net4.5がありましたが、参照されたライブラリにはターゲット4.6.1がありました。

MSコンパイラはよりスマートになり、より意味のあるエラーメッセージをログに記録できると確信しています。https://github.com/dotnet/roslyn/issues/14756に提案を追加しました


16

私の場合では、これはNuGetパッケージのアップデートのみで、DLLの依存関係への参照を更新していたことだったので、いくつかが、すべてではない矛盾のバージョンで結果-私の溶液中のプロジェクト。使い方はgrepスタイルのツールを私の溶液中* .csprojファイル内のテキストを検索するには、それはまだ更新されるために必要なプロジェクトを簡単に確認することができ、その後でした。


この答えをありがとう-私はそれがこれに近い何かであると思ったが、それを見てうれしかった。別の言い方をすれば、データレイヤーでオプションのパラメーターを使用してコンストラクターを呼び出す親プロジェクト(サービス)では、その参照が.csprojに追加されていませんでした。子ファイルと親.csprojファイルを比較すると、親に含まれていないはずのItemGroupが明らかになるはずです。
ライアンマン2017年

3
ソリューション(個々のプロジェクトではない)のVisual Studioパッケージマネージャーウィンドウには、[統合]タブがあり、プロジェクトごとにバージョンが異なるパッケージが表示されます。grepのようなツールよりも確かに優れています
Michael Freidgeim 2018年

7

このエラーが発生した場合は、使用しているコードがアセンブリ内の型を参照しているが、アセンブリはプロジェクトの一部ではないため、使用できないことを意味します。

Project.Rights.dllを削除することはあなたが望むものの反対です。プロジェクトがアセンブリを参照できることを確認する必要があります。したがって、グローバルアセンブリキャッシュまたはWebアプリケーションの〜/ Binディレクトリに配置する必要があります。

編集-アセンブリを使用したくない場合は、それを削除することも適切な解決策ではありません。代わりに、コード内でそれへのすべての参照を削除する必要があります。アセンブリは、作成したコードでは直接必要ではなく、参照している他の何かで必要になるため、参照されているアセンブリを、依存関係としてProject.Rights.dllを持たないものに置き換える必要があります。


2
アセンブリを使用できません。それが要件です。それを取り除き、App_Codeディレクトリ内にクラスを保存する必要があります。私はそれがどのように聞こえるか知っています、私を信じてください。すべてのビジネスロジックがDLLではなくApp_Code内に格納されるようにアプリケーションを変更するタスクを課されるのは、楽しいことではありません。
afaf12 2013

1
いいえ、それは彼がそれを参照して何かを使用していることを意味します(彼が直接使用しているわけではありません)。@ afaf12それを取り除く必要がある場合...誰がそれを使用しているか確認する必要があります(これを間接参照として想像してください)。単純にApp_Codeディレクトリにコードを貼り付けることはできません。コンパイルされたアセンブリは、元の(および外部の)アセンブリを参照します...
Adriano Repetti 2013

私も似たようなものを持っていて、あなたの投稿は大いに役立ちました。私の場合、アセンブリ「A」が参照されていました。このアセンブリは別のアセンブリ「B」を使用していました。プロジェクトに追加しましたが、アセンブリ「B」が見つからないというエラーが表示され続けました。アセンブリ「B」をbinディレクトリにコピーすると、問題は解決しました。その理由は、私のプロジェクトがアセンブリ "B"を使用していなかったが、アセンブリ "A"が使用していて、それが見つからなかったために例外がスローされたためです。ありがとう。
ykh 2016年

4

私の場合、間違ったプラットフォーム/構成でビルドされていたライブラリを参照していました(参照されたライブラリを作成したばかりです)。

さらに、Visual Studio構成マネージャーで問題を修正できませんでした。このライブラリの新しいプラットフォームと構成を切り替えて作成することができませんでした。そのプロジェクトのファイルのProjectConfigurationPlatformsセクションのエントリを修正することで修正.slnしました。そのすべての順列はに設定されましたDebug|Any CPU(私がそれをどのように行ったかはわかりません)。壊れたプロジェクトのエントリを作業中のプロジェクトのエントリで上書きし、各エントリのGUIDを変更しました。

機能しているプロジェクトのエントリ

{9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.ActiveCfg = Release|x64 {9E93345C-7A51-4E9A-ACB0-DAAB8F1A1267}.Release|x64.Build.0 = Release|x64

破損したプロジェクトのエントリ

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Debug|Any CPU {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Debug|Any CPU

破損したエントリが修正されました

{94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.ActiveCfg = Release|x64 {94562215-903C-47F3-BF64-8B90EF43FD27}.Release|x64.Build.0 = Release|x64

これが誰かに役立つことを願っています。


私にとっては似ていました。VIsual Studioは、一部のプロジェクトのGUIDをFAE04EC0-301F-11D3-BF4B-00C04F79EFBC(C#)から9A19103F-16F7-4668-BE54-9A1E7A4F7556(ASP.NET)に変更しました。私がそれらを元に戻した後、すべてがうまくいきました。
scor4er

3

たまたま、異なるプロジェクトが同じdllの異なるコピーを参照していることがわかりました。すべてがディスク上の同じファイルを参照していることを確認したところ、予想どおりにエラーが消えました。


1

[.NETアセンブリ]タブから参照を追加しようとしたときに、機能しませんでした。ただし、BROWSEを使用した参照をC:\ Windows \ Microsoft.NET \ Framework \ v4.0.30319に追加すると、機能しました。


0

主な理由の1つは、DLLのプロパティである可能性があります。specific version propertyこれは、それがtrueであるかどうかを確認するために何かを行う前に行う必要があります。

理由:ソースコードをビルドするときに他の(古い)バージョンと結合した可能性がありますが、このライブラリは新しいアップデートでアップグレードされ、Assembly Cashでバージョンが異なり、アプリケーションは新しいDLLを取得できなくなり、アプリケーションを無効に specific version propertyすると無料になりますDLL参照の新しいバージョンを取得するには


0

使用しているライブラリ(DLLファイル)には別のライブラリが必要な場合があります。私の場合、データベースエンティティモデルを含むライブラリを参照しましたが、エンティティフレームワークライブラリを参照するのを忘れていました。


0

これは、ライブラリで定義されている(パブリック)型を公開するライブラリを使用することを意味する場合もあります。これらをライブラリ(ビルドされないライブラリ)で特に使用しない場合でも

これがおそらく妨げているのは、使用できないクラス(そのシグネチャに参照されていないライブラリの型が含まれている)を使用するコードを作成することです。


0

私にとって、エラーが発生した理由は、エラーが報告されたWebFormが別のフォルダーから移動されたが、そのコードファイルクラスの名前が変更されず、実際のパスに対応していなかったためです。

初期状態:
元のファイルパス: /Folder1/Subfolder1/MyWebForm.aspx.cs元のコードファイル
クラス名: Folder1_Subfolder1_MyWebForm

ファイルが移動された後:
ファイルパス: /Folder1/MyWebForm.aspx.csコードファイル
クラス名(変更なし、エラーが表示されます): Folder1_Subfolder1_MyWebForm

解決策:
名前の変更あなたのcodefileクラスFolder1_Subfolder1_MyWebForm
1対応して新しいパスFolder1_MyWebForm

一度に-問題は解決し、エラーは報告されません。


0

タイプ 'Domain.tblUser'は、参照されていないアセンブリで定義されています。アセンブリ 'Domain、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = null'への参照を追加する必要があります。

**Solved:**
 Add reference of my domain library layer to my web app libary layer

注:DIコンテナーに従って、参照が正しいことを確認してください


0

私の場合、これは私が使用したためでした

暗黙の演算子

BLLDALクラスの間BLL。アプリケーション層でレイヤーを使用したい場合、このエラーが発生しました。私が変更され

暗黙の演算子

明示的な演算子

大丈夫です。ありがとう


0

私の場合、参照されているdllのバージョンは、実際には以前のものよりも新しいものでした。

以前のリリースにロールバックする必要があり、それで修正されました。


0

私にとって、これは、アセンブリ名が異なる2つの異なるビルドのBouncy Castleを参照するプロジェクトが直接的および間接的に(別の依存関係を介して)発生したためです。Bouncy Castleビルドの1つはNuGetパッケージで、もう1つはGitHubからダウンロードしたソースのデバッグビルドでした。どちらも名目上はバージョン1.8.1でしたが、GitHubコードのプロジェクト設定ではアセンブリ名がBouncyCastleに設定されていたのに対し、NuGetパッケージのアセンブリ名はBouncyCastle.Cryptoでした。プロジェクト設定を変更して、アセンブリ名を揃えることで、問題が修正されました。


1
修正方法も説明することで、回答をより役立つものにすることをお勧めします。
スティーブンケネディ

0

同様の問題があり、RuntimeFrameworkVersionを削除すると、問題が修正されました。

1.1.1またはを削除してみてください


0

この問題は、既存のプロジェクトを使用して新しく作成されたソリューションで発生しました。何らかの理由で、他のすべてのプロジェクトと同じ参照があり、参照されたプロジェクトも構築されていたにもかかわらず、1つのプロジェクトが他の1つのプロジェクトを「見る」ことができませんでした。1つのフレームワークで構築されていたが、他のフレームワークでは構築されていなかったため、複数のターゲットフレームワークに関係する何かを検出できなかったのではないかと思います。

クリーニングと再構築が機能せず、VSの再起動も機能しませんでした。

最終的に機能したのは、「VS 2019の開発者コマンドプロンプト」を開いてから、msbuild MySolution.slnコマンドを発行することでした。これは正常に完了し、その後VSも正常にビルドを開始しました。


-3

ソリューションをクリーンアップして再構築しました(Visual Studioでは、これらはソリューションエクスプローラーを右クリックしたときに表示されるオプションです)。プロジェクトでエラーが発生しなくなりました。

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