所以,(看似)突然之间,我的项目开始得到编译器警告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的文件中的预定义类型.
现在我真的在挠头.
我没有运行两个不同版本的.NET Framework(除非你算上2.0和3.5).
我没有引用可能让我怀疑的任何奇怪的集会.
我不记得对我的应用程序进行任何更改会刺激这种变化.
我已经验证所有组件都针对.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的
如果您需要更多信息,请告诉我,我很乐意提供.
另一种简单的验证方法:在您的代码中,暂时在某处使用该类.例:
System.Runtime.CompilerServices.ExtensionAttribute x = null;
构建时,这将产生错误:
类型'System.Runtime.CompilerServices.ExtensionAttribute'存在于'c:\ Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll'和.....
并立即向您显示导致冲突的两个来源.
LINQBridge让我立刻产生怀疑.这样做的全部意图是为2.0用户提供扩展属性/方法等.如果您有3.5(System.Core.dll),请不要使用LINQBridge.如果你确实需要LINQBridge 3.5中的某些不明原因(我想不出一个),那么你可能不得不使用extern别名.但我真的怀疑你需要它!
马克几乎肯定是正确的.这是一种验证方法
打开Reflector.exe
添加所有非系统程序集
F3并搜索ExtensionAttribute
如果它弹出System.Core以外的任何地方,那么你知道它来自哪里.
此问题的另一个解决方案是为整个程序集使用全局别名:
参考 - >属性 - >别名 - >用其他东西替换'全局'
仅供参考:我遇到了同样的问题,并且能够通过使用Resharper的"优化引用"命令来解决它,然后删除所有未使用的引用.不完全确定为什么会有效,但确实如此.