C#编译器警告1685

所以,(似乎)突然间,我的项目开始得到编译器警告1685年:

预定义types“System.Runtime.CompilerServices.ExtensionAttribute”在全局别名中的多个程序集中定义; 使用“c:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ System.Core.dll”中的定义

困惑,我研究了MSDN文章找出其原因。 以下是我find的信息:

Visual C#参考:错误和警告编译器警告(1级)CS1685

错误消息预定义types“System.type name”在全局别名中的多个程序集中定义; 使用“文件名”中的定义

在两个程序集中find预定义的系统types(如System.int32)时,会发生此错误。 这种情况发生的一种方式是,如果你是从两个不同的地方引用mscorlib,比如试图运行.Net Framework 1.0和1.1版本。

编译器将只使用其中一个程序集的定义。 编译器仅search全局别名,不search定义的库/引用。 如果指定了/ nostdlib,则编译器将searchObject,并且将来会在findObject的文件中启动对预定义types的所有search。

现在我真的在挠挠我的脑袋。

  1. 我没有运行两个不同版本的.NET Framework(除非你计算2.0和3.5)。

  2. 我没有提到可能会让我怀疑的任何奇怪的程序集。

  3. 我不记得对我的应用程序做出任何改变,这将促使这种变化。

  4. 我已经validation所有组件的目标是.NET Framework版本v2.0.50727。

我愿意接受build议,或者有关如何解决这个问题的想法。 我把警告视为错误,这让我发疯。

真正让我感到困惑的是,我不知道为什么会这样。 发生的事情应该有一个明显的原因,我应该知道他们为什么发生。 如果我不能解释它,我不能准确地补救它。 猜测是永远不会令人满意的。

该应用程序很简单,由一个类库和一个Windows窗体应用程序组成。

  • AC#类库DLL提供封装数据库访问的基本function。 此DLL引用以下组件:

    • 系统
    • System.Core程序
    • System.Core.Data
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient的
    • System.Drawing中
    • System.Windows.Forms的
    • 的System.Xml
    • System.Xml.Linq的
  • AC#Windows窗体应用程序提供的用户界面。 此应用程序引用了以下组件:

    • CleanCode
    • CleanCodeControls(这两个都提供了语法编辑器支持,并且是在.NET 3.5本地构build的)。
    • LinqBridge
    • Roswell.Framework(上面的类库)
    • 系统
    • System.Core程序
    • System.Data
    • System.Data.DataSetExtensions
    • System.Data.OracleClient的
    • System.Deployment
    • 系统devise
    • System.Drawing中
    • System.Windows.Forms的
    • 的System.Xml
    • System.Xml.Linq的

让我知道你是否需要进一步的信息,我会很乐意提供。

LINQBridge让我立即怀疑。 这整个意图是为2.0用户提供扩展属性/方法等。 如果你有3.5(System.Core.dll),不要使用LINQBridge。 如果你确实需要3.5中的LINQBridge出于一些不明确的原因(我想不出一个),那么你可能不得不使用一个外部别名。 但我真的怀疑你需要它!

另一个简单的方法来validation:在你的代码中,临时使用某个地方的类。 例:

System.Runtime.CompilerServices.ExtensionAttribute x = null; 

build设时,这会产生错误:

“c:\ Program Files \ Reference Assemblies \ Microsoft \ Framework \ v3.5 \ System.Core.dll”中都存在types“System.Runtime.CompilerServices.ExtensionAttribute”和…..

并立即告诉你造成冲突的两个来源。

马克几乎肯定是正确的。 这是一个validation的方法

  1. 打开Reflector.exe
  2. 添加所有非系统程序集
  3. F3并searchExtensionAttribute

如果它popupSystem.Core以外的任何地方,那么你知道它来自哪里。

解决此问题的另一个解决scheme是对整个程序集使用全局别名:

参考 – >属性 – >别名 – >用其他东西replace'全球'

仅供参考:我有同样的问题,并能够解决它通过使用Resharper的“优化参考”命令,然后删除所有未使用的引用。 不完全确定为什么这个工作,但它。

此问题的另一个解决scheme=>右键单击项目 – >属性 – >生成 – >将警告视为错误 – >无