如何让一个单独的.NET程序集同时支持2.0、3.0、3.5、4.0和4.5版本,并为C#和VB.NET消费者提供扩展方法?
标准建议是添加以下内容:
namespace System.Runtime.CompilerServices
{
public sealed class ExtensionAttribute : Attribute { }
}
这是更多和一位微软员工提出的方法,甚至被MSDN杂志推荐。许多博客作者称其为“没有负面影响”。除了会导致面向.NET 3.5或更高版本的VB.NET项目编译器错误外,这种方法广受好评。Microsoft.Core.Scripting.dll的作者们已经解决了这个问题,将“public”改为“internal”。
namespace System.Runtime.CompilerServices
{
internal sealed class ExtensionAttribute : Attribute { }
}
这似乎解决了VB兼容性问题。
因此,我信任地采用了该方法来处理广泛使用的ImageResizing.Net库的最新版本(3.2.1)。
但是,然后,我们开始为某些针对.NET 3.5+的用户随机遇到这个编译器错误(原始报告)。
Error 5 Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'
由于 MSBuild/VisualStudio 编译器在解析命名冲突时显然不会考虑作用域规则,并且程序集引用的顺序起着非常重要但未被全面记录的作用,因此我不完全理解为什么以及何时会发生这种情况。
有一些笨拙的变通方法,例如更改程序集命名空间、重新创建项目文件、删除/重新添加 System.Core 并调整 .NET Framework 的目标版本。不幸的是,这些变通方法都不是 100% 可行的(除了定义别名,但这是无法接受的痛苦)。
如何在以下情况下解决该问题:
- 保持对程序集内扩展方法使用的支持,
- 保持对 .NET 2.0/3.0 的支持,
- 不需要为每个 .NET Framework 版本使用多个程序集。
SO 上相关的问题并没有回答这个问题。