逃逸捕捉-22扩展属性在.NET 2.0(Escape Catch-22 with extensio

2019-06-25 11:22发布

怎么能一个.NET程序集,靶向C#和VB.NET消费者2.0,3.0,3.5,4.0和4.5的同时,支持扩展方法?

标准的建议是补充一点:

namespace System.Runtime.CompilerServices
{
  public sealed class ExtensionAttribute : Attribute { }
}

这种做法被认为更比一个微软员工 ,并甚至在特色MSDN杂志 。 它广泛被喻为许多博客因为有“没有不良影响”。

哦,除了会引起从VB.NET工程目标.NET 3.5或更高的编译器错误。

Microsoft.Core.Scripting.dll的作者想通了 ,并改变了“公”到“内部”。

namespace System.Runtime.CompilerServices
{
  internal sealed class ExtensionAttribute : Attribute { }
}

这似乎解决了VB兼容性问题。

所以,我满怀信心地用于最新版本(3.2.1),该方法被广泛使用的ImageResizing.Net库 。

后来 ,我们开始收到此编译器错误( 原报告 ),或多或少随机,对某些用户针对.NET 3.5+。

Error 5 Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'

由于的MSBuild /编译VisualStudio中显然不打扰解决命名冲突的时候看的作用域规则和程序集引用的顺序播放一个不很-docuemented角色,我不完全理解当这种情况发生的原因和。

这里有几个哈克变通办法 ,如改变程序集命名空间,重新创建项目文件,删除/ readding System.Core程序,并与.NET Framework的目标版本摆弄。 不幸的是,没有这些解决方法是100%(除了混叠,但是这是无法接受的疼痛)。

我怎样才能解决这个问题,而

  1. 保持组件内,用于扩展方法使用支持,
  2. 用于.NET 2.0 / 3.0维持支持
  3. 不要求每个.NET framework版本的多个组件。

或者,是否有修补程序,以使编译器要注意作用域规则?

在这样才不会回答这个问题相关的问题

  • 在.NET 2.0 C#扩展方法
  • 使用与.NET Framework 2.0的扩展方法
  • 约ExtensionAttribute奇怪的警告
  • 在Asp.Net使用铁的Python时ExtensionAttribute Ambigious参考
  • 我应该支持.NET 2.0?
  • 使用.NET 2.0中的扩展方法?

Answer 1:

我们遇到了与IronPython的同样的问题。 http://devhawk.net/2008/10/21/the-fifth-assembly/

最后我们把我们的ExtensionAttribute的定制版本,以自己的组装。 这样一来,客户可以参考我们的定制ExtensionAttribute组装或System.Core程序之间进行选择 - 但从来都!

另一个棘手的事情是,你必须始终部署ExtensionAttribute装配 - 即使你不引用在您的项目。 暴露扩展方法您的项目集将有一个assemblyref到定制ExtensionAttribute组装,所以CLR会生气,如果它不能被发现。

鉴于.NET 2.0支持的硬性要求,我认为最好的办法是简单地根本不使用扩展方法。 我不熟悉的ImageResizer项目,但它听起来像这样在ImageResizer最近的变化。 这将如何可行的是改变扩展方法,传统的静态方法? 实际上,我们想了IronPython的/ DLR,但它是不可行的(我们与LINQ合并在这一点上和LINQ已经大量使用的扩展方法基本上是其整个存在)。



文章来源: Escape Catch-22 with extension attributes in .NET 2.0