所以,(看似)突然之间,我的项目开始得到编译器警告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引用以下组件:
提供UI的AC#Windows Forms应用程序.此应用程序引用以下组件:
如果您需要更多信息,请告诉我,我很乐意提供.
同时针对2.0,3.0,3.5,4.0和4.5的单个.NET程序集如何支持C#和VB.NET使用者的扩展方法?
标准建议是添加:
namespace System.Runtime.CompilerServices
{
public sealed class ExtensionAttribute : Attribute { }
}
Run Code Online (Sandbox Code Playgroud)
这种做法被认为更比一个微软员工,并甚至在特色MSDN杂志.它被许多博主广泛称赞为"没有不良影响".
哦,除了它会导致针对.NET 3.5或更高版本的VB.NET项目的编译器错误.
Microsoft.Core.Scripting.dll的作者发现了这一点,并将"公共"改为"内部".
namespace System.Runtime.CompilerServices
{
internal sealed class ExtensionAttribute : Attribute { }
}
Run Code Online (Sandbox Code Playgroud)
这似乎解决了VB兼容性问题.
因此,我信任地将该方法用于广泛使用的ImageResizing.Net库的最新版本(3.2.1).
但是随后,我们开始收到此编译器错误(原报告),或多或少随机,对某些用户针对.NET 3.5+.
Error 5 Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'
Run Code Online (Sandbox Code Playgroud)
因为MSBuild/VisualStudio编译器在解决命名冲突时显然不打算查看范围规则,并且程序集引用的顺序扮演一个不完全文档化的角色,所以我不完全理解为什么以及何时发生这种情况.
这里有几个哈克变通办法,如改变程序集命名空间,重新创建项目文件,删除/ readding System.Core程序,并与.NET Framework的目标版本摆弄.不幸的是,这些变通方法都不是100%(除了别名,但这是一种令人无法接受的痛苦).
我怎样才能解决这个问题
或者,是否有一个修补程序使编译器注意范围规则?
关于SO的相关问题没有回答这个问题