C#编译器警告1685

Mik*_*fer 45 .net c# compiler-warnings

所以,(看似)突然之间,我的项目开始得到编译器警告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 Framework版本1.0和1.1.

编译器将仅使用其中一个程序集中的定义.编译器仅搜索全局别名,不搜索库定义/引用.如果已指定/ nostdlib,则编译器将搜索Object,并在将来启动所有搜索到找到Object的文件中的预定义类型.

现在我真的在挠头.

  1. 我没有运行两个不同版本的.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 Forms应用程序.此应用程序引用以下组件:

    • 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的

如果您需要更多信息,请告诉我,我很乐意提供.

Rem*_*rik 96

另一种简单的验证方法:在您的代码中,暂时在某处使用该类.例:

System.Runtime.CompilerServices.ExtensionAttribute x = null;
Run Code Online (Sandbox Code Playgroud)

构建时,这将产生错误:

类型'System.Runtime.CompilerServices.ExtensionAttribute'存在于'c:\ Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'和.....

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

  • 凉.实际上我甚至不需要构建,只要我将该行粘贴到代码文件中,intellisense警告告诉我所有我需要知道的! (2认同)
  • 这是一个更好的一般答案. (2认同)
  • 最后!一种找出实际导致此警告的文件的方法。 (2认同)

Mar*_*ell 22

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


Jar*_*Par 22

马克几乎肯定是正确的.这是一种验证方法

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

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


Vit*_*lyB 9

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

参考 - >属性 - >别名 - >用其他东西替换'全局'


Efr*_*ain 5

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