46

したがって、(一見) 突然、私のプロジェクトはコンパイラ警告 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 を指定した場合、コンパイラは Object を検索し、その後、Object が見つかったファイル内の事前定義された型のすべての検索を開始します。

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

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

  2. 疑わしいと思われる奇妙なアセンブリについては言及していません。

  3. この変更に拍車をかけるような変更をアプリケーションに加えた覚えはありません。

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

これを修正する方法についての提案やアイデアをお待ちしています。私は警告をエラーとして扱います。

それについて本当に私を悩ませているのは、なぜそれが起こっているのかわからないということです. 起こったことには明確な原因が必要であり、なぜそれが起こったのかを知る必要があります。説明できない場合、正確に修正することはできません。当て推量は決して満足のいくものではありません。

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

  • データベース アクセスをカプセル化する基本機能を提供する AC# クラス ライブラリ 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 を提供する AC# Windows フォーム アプリケーション。このアプリケーションは、次のコンポーネントを参照します。

    • クリーンコード
    • CleanCodeControls (これらは両方とも構文エディターのサポートを提供し、.NET 3.5 に対してローカルにビルドされます)。
    • リンクブリッジ
    • Roswell.Framework (上記のクラス ライブラリ)
    • システム
    • System.Core
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • System.Deployment
    • システムデザイン
    • System.Drawing
    • System.Windows.Forms
    • System.Xml
    • System.Xml.Linq

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

4

6 に答える 6

99

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

System.Runtime.CompilerServices.ExtensionAttribute x = null;

ビルド時に、これによりエラーが発生します。

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

そして、競合の原因となっている 2 つのソースをすぐに表示します。

于 2011-06-29T09:22:04.677 に答える
22

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

于 2009-03-02T16:20:29.320 に答える
22

マークはほぼ間違いなく正しいです。確認方法はこちら

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

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

于 2009-03-02T16:32:50.337 に答える
9

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

参照 -> プロパティ -> エイリアス -> 「グローバル」を別のものに置き換えます

于 2010-11-09T13:48:01.680 に答える
5

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

于 2012-05-03T09:19:36.680 に答える