web-dev-qa-db-ja.com

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

エラーメッセージは一般的であり、このエラーについて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

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

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

65
afaf12

このエラーが発生した場合、何が起こっているのかが必ずしも明らかではありませんが、エラーが示すように、参照がありません。例として次のコード行を使用します。

MyObjectType a = new MyObjectType("parameter");

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

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

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

うまくいけば、少なくともこれで正しい方向に進むことができます!

84
drew_w

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

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

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

39

私の場合、これは、NuGetパッケージの更新を行うと、someのdll依存関係への参照のみが更新されたが、すべてではないためソリューション内のプロジェクト-バージョンの競合が発生します。 grepスタイルのツール を使用して、ソリューションの* .csprojファイル内のテキストを検索すると、更新が必要なプロジェクトを簡単に確認できました。

13
rogersillito

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

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

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

7
mason

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

3
Gonzalo Méndez

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

さらに、Visual Studio Configuration Managerの問題を修正できませんでした。このライブラリの新しいプラットフォームと構成を切り替えて作成することはできません。そのプロジェクトの.slnファイルのProjectConfigurationPlatformsセクションのエントリを修正して修正しました。その順列はすべて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

これが誰かの助けになることを願っています。

3
Joseph

.NET Assembliesタブから参照を追加しようとしても、うまくいきませんでした。ただし、BROWSE to C:\ Windows\Microsoft.NET\Framework\v4.0.30319を使用して参照を追加すると、うまくいきました。

1

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

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

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

解決策:
名前変更コードファイルクラスFolder1_Subfolder1_MyWebForm
to one 対応する with new pathFolder1_MyWebForm

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

0
Vladimír Hála

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

0
mathiash

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

暗黙の演算子

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

暗黙の演算子

明示的な演算子

大丈夫です。ありがとう

0

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

1.1.1を削除するか、

0
Arash

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

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

0
Hugo Nava Kopp

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

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

0
ath

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

0
Graham Laight

タイプ '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
Asif Raza

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

理由:多分、ソースコードはビルド時に他の(古い)バージョンと結合しますが、このライブラリは新しいアップデートでアップグレードされ、Assembly Cashとアプリケーションが新しいDLLを取得することを禁止されたバージョンになりました。 disablespecific version propertyapplacatenはDLL参照の新しいバージョンを自由に取得できます

0