相关疑难解决方法(0)

C#编译器警告1685

所以,(看似)突然之间,我的项目开始得到编译器警告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.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的

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

.net c# compiler-warnings

45
推荐指数
5
解决办法
3万
查看次数

Escape Catch-22在.NET 2.0中具有扩展属性

同时针对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%(除了别名,但这是一种令人无法接受的痛苦).

我怎样才能解决这个问题

  1. 维护对程序集内扩展方法使用的支持,
  2. 维护对.NET 2.0/3.0的支持
  3. 每个.NET框架版本不需要多个程序集.

或者,是否有一个修补程序使编译器注意范围规则?

关于SO的相关问题没有回答这个问题

clr extension-methods csc vbc

9
推荐指数
1
解决办法
1821
查看次数

标签 统计

.net ×1

c# ×1

clr ×1

compiler-warnings ×1

csc ×1

extension-methods ×1

vbc ×1