相关疑难解决方法(0)

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
查看次数

标签 统计

clr ×1

csc ×1

extension-methods ×1

vbc ×1