28 votes

Est-il possible de marquer un assemblage comme obsolète?

J'aimerais produire un message d'avertissement lorsque les utilisateurs de compiler du code qui fait référence à un assembly nous prévoyons sur le retrait. Le contenu de cette assemblée ont été fusionné avec un autre, et je tiens à encourager les utilisateurs à arrêter de référencement de l'ancienne assemblée.

Malheureusement, il ressemble à ObsoleteAttribute n'est pas valable pour les assemblages. Est-il un autre moyen pour provoquer un avertissement du compilateur lorsqu'un projet de référencement un ensemble construit?

Merci.

EDIT: Pour plus de précisions, voici ce que les assemblées ressembler avant et après la fusion

Avant la fusion:

Assembly1:
namespace A.B.C {
    class C1
    ...
}

Assembly2:
namespace A.B.D {
    class D1
    ...
}

Après la fusion:

Assembly1:
(empty)

Assembly2:
namespace A.B.C {
    class C1
    ...
}

namespace A.B.D {
    class D1
    ...
}

Avant la fusion, les utilisateurs référencés à la fois Assembly1 et Assembly2. Après la fusion, ils ont seulement besoin de référence Assembly2, mais je préfère produire un avertissement que Assembly1 n'est plus nécessaire que de briser leurs constructions en supprimant Assembly1 tout de suite.

Il semble que je devrais le type d'utilisation des transitaires pour s'assurer que les programmes qui ont déjà été construite à l'encontre de ces assemblées continuer à travailler sans recompiler, mais je ne veux pas laisser stub classes dans Assembly1 juste pour signaler l'assemblée comme obsolète.

28voto

Eric Lippert Points 300275

Lors du déplacement de types à partir d'un assemblage à l'autre la bonne chose à faire est d'utiliser un type de transitaire, pas de marque de l'ancienne assemblée classes comme obsolète.

Voir: "CLR Hoser - Les Merveilles de Whidbey Affacturage Fonctionnalités – Partie I: Type de Redirecteurs" par Richard Lander (2005)

4voto

IAbstract Points 9384

Je ne vois rien de spécifique sur MSDN. Vous pouvez, cependant, créer votre propre attribut d'assemblage, mais seulement si vous pensez que c'est qui est important. Puis de nouveau, cela n'empêche pas quelqu'un de l'utiliser et je ne suis pas sûr de savoir comment vous pouvez même laisser savoir à quelqu'un qu'elle a été désapprouvée.

Honnêtement, je pense que je mettrais [Obsolete] sur la mise à disposition du public des classes.

Basé sur ce que j'ai lu sur @Eric post et le lien qu'il a fourni avec WS commentaire, utilisez [TypeForwardedTo].

4voto

FlipScript Points 1959

Marquez chacune des classes de l'ancien assemblage comme inutilisable.

Cela a fonctionné pour moi:

 [Obsolete("Deprecated.  Use 'Substitute' class in 'NewAssembly' instead.")]
public class OutdatedClass : IDisposable, IXmlSerializable
{ 
    //code...
}
 

Lors de la tentative de compilation, j'ai reçu des tonnes d'avertissements concernant l'utilisation de cette classe.

Vous pouvez en faire une erreur de compilation pour référencer l'assembly en passant True comme deuxième paramètre à l'attribut.

 [Obsolete("Deprecated.  Use 'Substitute' class in 'NewAssembly' instead.", true)]

public class OutdatedClass : IDisposable, IXmlSerializable
{ 
    //code...
}
 

Je viens de tester cela, et cela a également fonctionné (c'est-à-dire que la compilation a échoué)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X