Come può un singolo assieme .NET, con targeting 2.0, 3.0, 3.5, 4.0 e 4.5, supportare i metodi di estensione per i consumatori C# e VB.NET?Escape Catch-22 con attributi di estensione in .NET 2.0
Il suggerimento standard è di aggiungere questo:
namespace System.Runtime.CompilerServices
{
public sealed class ExtensionAttribute : Attribute { }
}
Questo l'approccio suggerito da more di one Microsoft employee ed è stato anche descritto in MSDN magazine. È widely chiamato da many bloggers come "senza effetti negativi".
Oh, tranne che causerà un errore del compilatore da un progetto VB.NET che ha come target .NET 3.5 o versione successiva.
Gli autori di Microsoft.Core.Scripting.dll figured it out e modificato "pubblico" in "interno".
namespace System.Runtime.CompilerServices
{
internal sealed class ExtensionAttribute : Attribute { }
}
che sembrava risolvere il problema di compatibilità VB.
Quindi ho usato con fiducia questo approccio per l'ultima versione (3.2.1) di widely-used ImageResizing.Net library.
Ma poi, abbiamo iniziare a ricevere questo errore del compilatore (original report), più o meno casualmente, per alcuni utenti mirati .NET 3.5+.
Error 5 Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'
Poiché il/VisualStudio compilatore MSBuild a quanto pare non si preoccupa di guardare regole di visibilità per la risoluzione conflitti di denominazione, e l'ordine di riferimenti di assemblaggio svolge un ruolo non del tutto docuemented, non pienamente capisco perché e quando ciò accade
Ci sono uno few hacky workarounds, come cambiare lo spazio dei nomi dell'assieme, ricreare il file di progetto, eliminare/leggere System.Core e giocherellare con la versione di destinazione del framework .NET. Sfortunatamente, nessuno di questi workaround è al 100% (eccetto l'aliasing, ma è un dolore inaccettabile).
Come posso risolvere questo mentre
- Mantenere il supporto per l'utilizzo metodo di estensione all'interno del gruppo,
- Mantenere il supporto per .NET 2.0/3.0
- Non richiedendo più assembly per ogni versione di .NET framework .
Oppure, esiste un hotfix per fare in modo che il compilatore presti attenzione alle regole di scoping?
Domande correlate, in modo che non rispondono a questa domanda
- C# Extension methods in .NET 2.0
- Using Extension Methods with .NET Framework 2.0
- strange warning about ExtensionAttribute
- Ambigious reference for ExtensionAttribute when using Iron Python in Asp.Net
- Should I support .NET 2.0?
- Using extension methods in .NET 2.0?
Ugh. La tua taglia manca uno zero. Meglio affidarsi a questo supporto con Microsoft, anche se è probabile che lo eliminino con "non supportato". –