C#编译器警告1685

C#编译器警告1685,c#,.net,compiler-warnings,C#,.net,Compiler Warnings,因此,(似乎)出乎意料地,我的项目开始出现编译器警告1685: 预定义的类型 'System.Runtime.CompilerServices.ExtensionAttribute' 在中的多个程序集中定义 全球别名;使用定义 来自“c:\Program Files\Reference” Assemblies\Microsoft\Framework\v3.5\System.Core.dll' 困惑的是,我研究了MSDN文章以找出其原因。以下是我找到的信息: Visual C#参考:错误和错误 警

因此,(似乎)出乎意料地,我的项目开始出现编译器警告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等系统类型为 在两个程序集中找到。单程 如果您正在引用,则可能发生这种情况 来自两个不同地方的mscorlib, 例如尝试运行.Net 框架版本1.0和1.1 肩并肩

编译器将使用该定义 仅从其中一个程序集。这个 编译器只搜索全局别名, 不搜索已定义的库 /参考资料。如果您已经指定 /Nostlib,编译器将进行搜索 为对象,并在将来开始 在中对预定义类型的所有搜索 找到对象的文件

现在我真的抓狂了

  • 我不是在运行两个不同的 .NET Framework的版本 (除非你数2.0和3.5)

  • 我没有提到任何奇怪的事情 可能会让我 可疑

  • 我不记得对我的应用程序做过任何会刺激这种变化的更改

  • 我已经验证了所有组件都以.NET Framework v2.0.50727版为目标

  • 我愿意接受关于如何纠正这一点的建议或想法。我把警告视为错误,这让我发疯

    真正让我烦恼的是,我不知道为什么会发生这种事。发生的事情应该有明显的原因,我应该知道为什么会发生。如果我不能解释它,我就不能准确地纠正它。猜测永远不会令人满意

    该应用程序非常简单,由类库和windows窗体应用程序组成

    • 一个C#类库DLL,提供封装数据库访问的基本功能。此DLL引用以下组件:

      • 系统
      • 系统核心
      • 系统核心数据
      • 系统数据
      • System.Data.DataSetExtensions
      • System.Data.OracleClient
      • 系统图
      • System.Windows.Forms
      • Xml
      • System.Xml.Linq
    • 提供UI的C#Windows窗体应用程序。此应用程序引用以下组件:

      • 清除码
      • CleanCodeControl(这两个控件都提供语法编辑器支持,并且是针对.NET3.5本地构建的)
      • 林克布里奇
      • Framework(上面的类库)
      • 系统
      • 系统核心
      • 系统数据
      • System.Data.DataSetExtensions
      • System.Data.OracleClient
      • 系统部署
      • 系统设计
      • 系统图
      • System.Windows.Forms
      • Xml
      • System.Xml.Linq

    如果您需要进一步的信息,请告诉我,我很乐意提供。

    林克桥让我立即产生怀疑。其全部目的是为2.0用户提供扩展属性/方法等。如果您有3.5(System.Core.dll),不要使用LINQBridge。如果您确实需要3.5中的LINQBridge,原因不明(我想不出),那么您可能必须使用外部别名。但是我真的怀疑你需要它

    马克几乎肯定是对的。这里有一个验证的方法

  • 打开Reflector.exe
  • 添加所有非系统程序集
  • F3并搜索ExtensionAttribute

  • 如果它出现在System.Core之外的任何地方,那么你就知道它来自哪里

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


    参考->属性->别名->用其他内容替换“全局”

    另一种简单的验证方法: 在代码中,暂时在某个地方使用该类。 例如:

    生成时,这将生成错误:

    存在类型“System.Runtime.CompilerServices.ExtensionAttribute” 在两个'c:\Program Files\Reference'中 程序集\Microsoft\Framework\v3.5\System.Core.dll'和


    并立即向您显示导致冲突的两个源。

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

    此问题的另一个解决方案=>右键单击项目->属性->构建->将警告视为错误->无

    请参见以下内容:建议您关闭此问题。这是一个完全重复的问题。顺便说一句,这确实是LinqBridge造成的,在allI,你不再需要它,我搜索了警告号码,但找不到任何包含警告号码的问题;我为复制品道歉。顺便说一句,林克布里奇实际上是个问题。非常感谢。说得好。我已编辑链接问题以包含它。我意外地用.NET 3.5而不是4.5安装IIS,从而触发了此错误。修正是在控制面板的“添加功能…”中添加4.5。酷。事实上,我甚至不需要构建,只要我将这一行粘贴到代码文件中,intellisense警告就告诉了我需要知道的一切!这是一个更好的一般性答案。终于!一种找出导致此警告的实际文件的方法。我只是在我的项目目录中使用了
    grep-r ExtensionAttribute*
    ,并以这种方式找到了罪魁祸首。我绝不允许这样做。正确的代码没有警告。这感觉就像把它扫到地毯下面。这一警告可以因此得到解决。
    System.Runtime.CompilerServices.ExtensionAttribute x = null;