同时针对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%(除了别名,但这是一种令人无法接受的痛苦).
我怎样才能解决这个问题
或者,是否有一个修补程序使编译器注意范围规则?
关于SO的相关问题没有回答这个问题