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)时,会发生此错误。发生这种情况的一种方法是,如果您从两个不同的地方引用 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.Data.DataSetExtensions
    • System.Data.OracleClient
    • 系统绘图
    • System.Windows.Forms
    • 系统文件
    • System.Xml.Linq
  • AC# Windows 窗体应用程序提供 UI。此应用程序引用以下组件:

    • 清洁代码
    • CleanCodeControls(两者都提供语法编辑器支持,并且是针对 .NET 3.5 在本地构建的)。
    • 灵桥
    • Roswell.Framework(上面的类库)
    • 系统
    • 系统核心
    • 系统数据
    • System.Data.DataSetExtensions
    • System.Data.OracleClient
    • 系统部署
    • 系统设计
    • 系统绘图
    • System.Windows.Forms
    • 系统文件
    • System.Xml.Linq

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

4

6 回答 6

99

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

System.Runtime.CompilerServices.ExtensionAttribute x = null;

在构建时,这将产生错误:

'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(我想不出一个),那么您可能必须使用外部别名。但我真的怀疑你需要它!

于 2009-03-02T16:20:29.320 回答
22

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

  1. 打开反射器.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 回答
-4

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

于 2015-01-08T14:13:49.150 回答