Comment un seul assembly .NET, ciblant 2.0, 3.0, 3.5, 4.0 et 4.5, peut-il prendre en charge des méthodes d'extension pour les clients C# et VB.NET?Escape Catch-22 avec attributs d'extension dans .NET 2.0
La suggestion standard est d'ajouter ceci:
namespace System.Runtime.CompilerServices
{
public sealed class ExtensionAttribute : Attribute { }
}
Cette approche suggérée par more que one Microsoft employee et a même été présenté dans MSDN magazine. C'est widely salué par many bloggers comme n'ayant «aucun effet néfaste».
Oh, sauf que cela provoquera une erreur de compilateur d'un projet VB.NET ciblant .NET 3.5 ou supérieur.
Les auteurs de Microsoft.Core.Scripting.dll figured it out et sont passés de 'public' à 'internal'.
namespace System.Runtime.CompilerServices
{
internal sealed class ExtensionAttribute : Attribute { }
}
Ce qui semblait résoudre le problème de compatibilité VB.
J'ai donc utilisé avec confiance cette approche pour la dernière version (3.2.1) du widely-used ImageResizing.Net library.
Mais puis, nous commençons à obtenir cette erreur du compilateur (original report), plus ou moins au hasard, pour certains utilisateurs ciblant 3.5+ .NET.
Error 5 Missing compiler required member
'System.Runtime.CompilerServices.ExtensionAttribute..ctor'
Parce que le compilateur MSBuild/de VisualStudio ne semble pas la peine de regarder les règles de portée lors de la résolution des conflits de noms et l'ordre des références d'assemblage joue un rôle non-tout à fait-docuemented, je ne comprends pas très bien pourquoi et quand cela arrive.
few hacky workarounds Il existe un few hacky workarounds, comme changer l'espace de noms d'assembly, recréer le fichier de projet, supprimer/readding System.Core, et jouer avec la version cible de l'infrastructure .NET. Malheureusement, aucune de ces solutions de contournement ne sont 100% (sauf aliasing, mais c'est une douleur inacceptable).
Comment puis-je résoudre ce problème tout en
- Le maintien de soutien à l'utilisation de la méthode d'extension dans l'ensemble,
- Maintenir le soutien au 2.0/.NET 3.0
- Ne nécessitant pas plusieurs assemblées pour chaque version du framework .NET .
Ou, existe-t-il un correctif pour que le compilateur prenne en compte les règles de portée?
Questions connexes sur SO qui ne répondent pas à cette question
- 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?
Pouce. Votre prime manque un zéro. Le mieux est de prendre cela en charge avec Microsoft Support, bien qu'ils soient susceptibles de le rejeter avec 'non supporté'. –