题
因此,(看似)出乎意料的是,我的项目开始收到编译器警告 1685:
预定义的类型'system.runtime.compilerServices.extensionAttribute'在全局别名的多个组件中定义;使用来自“ C: Program Files Reference Assemblies Microsoft Framework V3.5 System.Core.core.dll'的定义”
困惑之余,我研究了 MSDN 文章以找出其原因。这是我找到的信息:
视觉 C# 参考:错误和警告编译器警告(1级)CS1685
错误消息预定义的类型“ system.type名称”是在全局别名的多个组件中定义的;使用“文件名”中的定义
当在两个组件中找到预定义的系统类型(例如System.Int32)时,就会发生此错误。这可能发生的一种方法是,如果您是从两个不同的位置引用MSCORLIB,例如尝试运行.NET Framework版本1.0和1.1并排。
编译器将仅使用一个组件中的定义。编译器仅搜索全局别名,不会搜索定义 /参考的库。如果您已指定 /nostdlib,则编译器将搜索对象,并且将来启动所有搜索文件中找到对象的预定义类型。
现在我真是摸不着头脑。
我没有运行两个不同版本的.NET框架(除非您计算2.0和3.5)。
我没有提及任何可能让我怀疑的奇异集会。
我不记得对我的应用程序进行过任何会引发此更改的更改。
我已验证所有组件都面向 .NET Framework 版本 v2.0.50727。
我愿意接受有关如何纠正此问题的建议或想法。我将警告视为错误,这让我发疯。
真正让我烦恼的是我不知道 为什么 它正在发生。发生的事情应该有明显的原因,我应该知道为什么会发生。如果我不能解释它,我就无法准确地补救它。猜测永远不会令人满意。
该应用程序很简单,由一个类库和一个 Windows 窗体应用程序组成。
一个 C# 类库 DLL,提供封装数据库访问的基本功能。该 DLL 引用以下组件:
- 系统
- 系统核心
- 系统.核心.数据
- 系统数据
- 系统.数据.数据集扩展
- 系统.数据.OracleClient
- 系统图
- 系统.Windows.窗体
- 系统.Xml
- 系统.Xml.Linq
提供 UI 的 C# Windows 窗体应用程序。该应用程序引用了以下组件:
- 干净的代码
- CleanCodeControls(这两者都提供语法编辑器支持,并且是针对 .NET 3.5 本地构建的)。
- 林克桥
- Roswell.Framework(上面的类库)
- 系统
- 系统核心
- 系统数据
- 系统.数据.数据集扩展
- 系统.数据.OracleClient
- 系统部署
- 系统设计
- 系统图
- 系统.Windows.窗体
- 系统.Xml
- 系统.Xml.Linq
如果您需要更多信息,请告诉我,我很乐意提供。
解决方案
LINQBridge 立即让我产生了怀疑。其全部目的是为 2.0 用户提供扩展属性/方法等。如果您有 3.5 (System.Core.dll),请不要使用 LINQBridge。如果你 做 由于某些晦涩的原因(我想不出)需要 3.5 中的 LINQBridge,那么您可能必须使用 extern 别名。但是我 真的 怀疑你需要它!
其他提示
另一种简单的验证方法:在您的代码中,暂时在某处使用该类。例子:
System.Runtime.CompilerServices.ExtensionAttribute x = null;
构建时,会产生错误:
'system.runtime.compilerServices.extensionAttribute'c中存在'c: program files reference assemblies microsoft framework v3.5 v3.5 system.core.core.dll'and .....
并立即向您展示导致冲突的两个来源。
马克几乎肯定是正确的。这里有一个方法来验证
- 打开反射器.exe
- 添加所有非系统程序集
- F3 并搜索 ExtensionAttribute
如果它在 System.Core 之外的任何地方弹出,那么您就知道它来自哪里。
此问题的另一个解决方案是对整个程序集使用全局别名:
参考 -> 属性 -> 别名 -> 将“global”替换为其他内容
供参考:我遇到了同样的问题,并且能够通过使用 Resharper 的“优化引用”命令来解决它,然后删除所有未使用的引用。不完全确定 为什么 那行得通,但确实如此。
此问题的另一个解决方案 => 右键单击项目 -> 属性 -> 构建 -> 将警告视为错误 -> 无