我收到一个奇怪的警告:
预定义类型 'System.Runtime.CompilerServices.ExtensionAttribute' 在全局别名中的多个程序集中定义;使用来自 'c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll' 的定义
没有给出行号,所以很难弄清楚它是关于什么的。
编译器错误代码是CS1685
我收到一个奇怪的警告:
预定义类型 'System.Runtime.CompilerServices.ExtensionAttribute' 在全局别名中的多个程序集中定义;使用来自 'c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll' 的定义
没有给出行号,所以很难弄清楚它是关于什么的。
编译器错误代码是CS1685
您是否正在使用某人的 dll(或您自己的)本身已经实现了此属性(具有完全相同的名称)作为在 .Net 3.5 运行时之前使用某些 c# 3.0 功能的一种方式?(一个常见的技巧)
这是可能的原因。因为它使用的是正确的(GAC 中的 MS),所以这不是问题,尽管您应该找到另一个并将其删除。
扩展 ShuggyCoUk 的(正确)答案
说实话,使用哪个版本的属性并不重要(GAC、第 3 部分等)。重要的是 C#/VB 编译器可以找到一些具有正确名称的属性。该属性在代码中没有任何功能用途。它的存在纯粹是为了告诉编译器“嘿,这是一种扩展方法”。
您可以放心地忽略此警告。
我同意 ShuggyCoUk 的观点,即最好的做法是尝试删除有问题的 dll。不过,这可能是不可能的。
解决编译器抱怨的歧义的另一种方法是更改引用的 dll 的别名。在您的项目中,在 References 文件夹中,如果单击引用的 dll,您将看到 Aliases 属性。默认情况下,这是“global”,它允许您执行“global::SomeNamespace.SomeType”之类的操作。您可能只需将别名更改为其他名称。
这解决了我需要引用 Microsoft.Scripting.Core.dll 的问题,但它包含一些与 mscorlib.dll 冲突的类型。我将 Aliases 属性更改为“第三方”而不是“全局”,从而修复了警告。
我也有同样的问题。
在我的情况下,问题是程序集 Mono.Cecil。
从本地引用迁移到 nuget,当我添加 NHibernate 引用时,包会自动添加此引用。
此引用已被删除,并再次编译了我的项目。
删除它并快乐!
这张图片取自 ILSpy ( http://i.stack.imgur.com/Qyd5o.png )
编译器不知道哪个 System.Runtime.CompilerServices.ExtensionAttribute
所以它使用来自 c:\Program Files\Reference Assemblies\Microsoft\Framework\v3.5\System.Core.dll' 的定义
您正在使用的 .dll 可能具有相同的扩展名。
我通过使用 .NET 3.5 而不是 4.5 安装 IIS 意外触发了此错误。
修复是在控制面板的“添加功能...”中重新添加 4.5。