web-dev-qa-db-ja.com

C#コンパイラの警告1685

したがって、(一見)突然、私のプロジェクトはコンパイラの警告1685を取得し始めます。

事前定義されたタイプ「System.Runtime.CompilerServices.ExtensionAttribute」は、グローバルエイリアスの複数のアセンブリで定義されています。 'c:\ Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'の定義を使用

困惑した私は、MSDNの記事を調査してその原因を突き止めました。これが私が見つけた情報です:

Visual C#リファレンス:エラーと警告コンパイラ警告(レベル1)CS1685

エラーメッセージ定義済みの型 'System.type name'は、グローバルエイリアスの複数のアセンブリで定義されています。 「ファイル名」の定義を使用

このエラーは、System.int32などの事前定義されたシステムタイプが2つのアセンブリで見つかった場合に発生します。これが発生する可能性のある1つの方法は、.Net Frameworkバージョン1.0と1.1を並行して実行するなど、2つの異なる場所からmscorlibを参照している場合です。

コンパイラは、1つのアセンブリからの定義のみを使用します。コンパイラはグローバルエイリアスのみを検索し、/ referenceで定義されたライブラリは検索しません。/nostdlibを指定した場合、コンパイラーはオブジェクトを検索し、将来、オブジェクトが見つかったファイル内の事前定義されたタイプのすべての検索を開始します。

今、私は本当に頭を掻いています。

  1. 2つの異なるバージョンの.NET Frameworkを実行していません(2.0と3.5を数えない限り)。

  2. 私は疑わしいかもしれない奇妙なアセンブリを参照していません。

  3. この変更を促進するような変更をアプリケーションに加えたことを覚えていません。

  4. すべてのコンポーネントが.NET Frameworkバージョンv2.0.50727をターゲットにしていることを確認しました。

私はこれを修正する方法についての提案やアイデアを受け入れています。私は警告をエラーとして扱い、それが私を狂わせています。

それについて本当に私を悩ませているのは、私が知らないということです-なぜそれが発生しています。起こったことには識別可能な原因があり、なぜそれらが起こったのかを知っているべきです。説明がつかない場合は、正確に修正することはできません。推測作業は決して満足できるものではありません。

アプリケーションは簡単で、クラスライブラリとWindowsフォームアプリケーションで構成されています。

  • C#クラスライブラリDLLデータベースアクセスをカプセル化する基本機能を提供します。これはDLLが次のコンポーネントを参照します:

    • システム
    • System.Core
    • System.Core.Data
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • System.Drawing
    • System.Windows.Forms
    • System.Xml
    • System.Xml.Linq
  • UIを提供するC#Windowsフォームアプリケーション。このアプリケーションは、次のコンポーネントを参照します。

    • CleanCode
    • CleanCodeControls(どちらも構文エディターのサポートを提供し、.NET 3.5に対してローカルに構築されます)。
    • LinqBridge
    • Roswell.Framework(上記のクラスライブラリ)
    • システム
    • System.Core
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • System.Deployment
    • システム設計
    • System.Drawing
    • System.Windows.Forms
    • System.Xml
    • System.Xml.Linq

さらに情報が必要な場合はお知らせください。喜んで提供させていただきます。

45
Mike Hofer

LINQBridgeはすぐに疑わしくなります。これの全体的な意図は、2.0ユーザーに拡張属性/メソッドなどを提供することです。 3.5(System.Core.dll)を使用している場合は、LINQBridgeを使用しないでください。 doが何らかの理由で3.5でLINQBridgeを必要とする場合(そして私は1つとは思えない)、外部エイリアスを使用する必要があるかもしれません。しかし、私は本当にあなたがそれを必要とすることを疑います!

22
Marc Gravell

もう1つの簡単な確認方法:コードで、どこかでクラスを一時的に使用します。例:

System.Runtime.CompilerServices.ExtensionAttribute x = null;

ビルドするとき、これはエラーを生成します:

タイプ「System.Runtime.CompilerServices.ExtensionAttribute」は、「c:\ Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll」と...の両方に存在します。

そして、競合を引き起こしている2つのソースをすぐに表示します。

96
Remco te Wierik

マークはほぼ間違いなく正しいです。確認する方法は次のとおりです

  1. Reflector.exeを開きます。
  2. 非システムアセンブリをすべて追加する
  3. F3とExtensionAttributeを検索

System.Core以外の場所に表示された場合は、それがどこから来ているかがわかります。

22
JaredPar

この問題の別の解決策は、アセンブリ全体にグローバルエイリアスを使用することです。

参照->プロパティ->エイリアス-> 'global'を他のものに置き換えます

9
VitalyB

参考:同じ問題があり、Resharperの「参照の最適化」コマンドを使用して、未使用の参照をすべて削除することで解決できました。完全にはわかりません理由うまくいきましたが、うまくいきました。

5
Efrain