質問
そのため、(一見) 突然、私のプロジェクトはコンパイラ警告 1685 を取得し始めます。
事前定義されたタイプ 'system.runtime.compilerservices.extensionAttribute'は、グローバルエイリアスの複数のアセンブリで定義されています。'c: program files reference assemblies microsoft framework v3.5 system.core.dll'からの定義を使用
困惑した私は、原因を突き止めるために MSDN の記事を調べました。私が見つけた情報は次のとおりです。
ビジュアル C# リファレンス:エラーと警告コンパイラ警告(レベル1)CS1685
エラーメッセージ事前定義されたタイプ 'System.Type Name'は、グローバルエイリアスの複数のアセンブリで定義されています。「ファイル名」からの定義を使用する
このエラーは、System.Int32などの事前定義されたシステムタイプが2つのアセンブリにあるときに発生します。これが起こる1つの方法は、.NETフレームワークバージョン1.0と1.1の並行を実行しようとするなど、2つの異なる場所からMscorlibを参照する場合です。
コンパイラは、アセンブリの1つのみから定義を使用します。コンパイラはグローバルエイリアスのみを検索し、定義 /参照ライブラリを検索しません。/nostdlibを指定した場合、コンパイラはオブジェクトを検索し、将来、オブジェクトが見つかったファイル内の事前定義されたタイプのすべての検索を開始します。
今、本当に頭を悩ませています。
.NETフレームワークの2つの異なるバージョンを実行していません(2.0と3.5をカウントしない限り)。
私は疑わしいかもしれない奇妙なアセンブリを参照していません。
この変更を促すような変更をアプリケーションに加えた覚えはありません。
すべてのコンポーネントが .NET Framework バージョン v2.0.50727 をターゲットにしていることを確認しました。
これを修正する方法についての提案やアイデアをお待ちしています。私は警告をエラーとして扱うので、気が狂いそうになります。
それについて本当に私を悩ませているのは、私が知らないということです なぜ それは起こっています。起こることには明確な原因があるはずで、なぜそれが起こったのかを私は知る必要があります。説明できなければ正確に解決することはできません。推測だけでは決して満足のいくものではありません。
このアプリケーションは単純で、クラス ライブラリと Windows フォーム アプリケーションで構成されています。
データベース アクセスをカプセル化する基本機能を提供する C# クラス ライブラリ DLL。この DLL は次のコンポーネントを参照します。
- システム
- システム.コア
- システム.コア.データ
- システム.データ
- System.Data.DataSetExtensions
- System.Data.OracleClient
- システム.図面
- System.Windows.Forms
- System.Xml
- System.Xml.Linq
UI を提供する C# Windows フォーム アプリケーション。このアプリケーションは次のコンポーネントを参照します。
- クリーンコード
- CleanCodeControls (どちらも構文エディターのサポートを提供し、.NET 3.5 に対してローカルに構築されます)。
- リンクブリッジ
- Roswell.Framework (上記のクラス ライブラリ)
- システム
- システム.コア
- システム.データ
- System.Data.DataSetExtensions
- System.Data.OracleClient
- システム.デプロイメント
- システムデザイン
- システム.図面
- System.Windows.Forms
- System.Xml
- System.Xml.Linq
さらに詳しい情報が必要な場合はお知らせください。喜んで提供させていただきます。
解決
LINQBridge を見るとすぐに疑ってしまいます。この全体の目的は、2.0 ユーザーに拡張属性/メソッドなどを提供することです。3.5 (System.Core.dll) を使用している場合は、LINQBridge を使用しないでください。もし、あんたが する 何らかのあいまいな理由 (私には思いつきません) で 3.5 で LINQBridge が必要な場合は、外部エイリアスを使用する必要があるかもしれません。しかし、私 本当に それが必要かどうかは疑わしい!
他のヒント
別の簡単な確認方法: コードで、一時的にクラスをどこかで使用します。 例:
System.Runtime.CompilerServices.ExtensionAttribute x = null;
ビルド時に、これはエラーを生成します:
「System.Runtime.CompilerServices.ExtensionAttribute」タイプが存在します 両方の 'c:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ System.Core.dll 'および.....
また、競合の原因となっている2つのソースをすぐに表示します。
マークはほぼ間違いなく正しいです。確認する方法は次のとおりです
- Reflector.exeを開く
- 非システムアセンブリをすべて追加
- F3およびExtensionAttributeの検索
System.Core以外の場所にポップアップ表示された場合、それがどこから来たかがわかります。
この問題の別の解決策は、アセンブリ全体にグローバルエイリアスを使用することです:
リファレンス->プロパティ->エイリアス-> 「グローバル」を別のものに置き換えます
FYI:同じ問題があり、Resharperの「参照の最適化」を使用して解決できました。コマンド、およびすべての未使用の参照を削除します。動作するのはなぜ完全にはわかりませんが、動作しました。
この問題の別の解決策=プロジェクトを右クリック->プロパティ->ビルド->警告をエラーとして扱う->なし