IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Reflection privée et SetValue(,)


Sujet :

C#

  1. #1
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut Reflection privée et SetValue(,)
    Bonjour,

    Suite à une question récente sur le forum, j'ai vu qu'il était possible via System.Reflection d'accèder à des membres privés d'une classe et d'utiliser SetValue pour modifier une valeur ou GetValue pour lire.

    Quelles sont les conditions à remplir pour qu'un tel code fonctionne ?

    Comment protéger ses propres classes de lecture / modification de valeurs non publiques par un code étranger ?

    Merci.

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    A ma connaissance, ce n'est pas possible... A ma connaissance, cela dit
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Qu'est ce qui n'est pas possible ?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Salut,

    tu peux marquer ton assembly (à ma connaissance, on ne peut pas faire un marquage plus bas (class ou autres)) avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [assembly:ReflectionPermission(SecurityAction.RequestRefuse, Unrestricted=true)]
    Si on tente d'acceder à un membre privée par l'invocation, il te lancera une exception (FieldAcces ...).

    edit : tu peux aussi, plus simplement et si tu le peux, marquer tes champs comme const ou readonly, la reflection ne permettra pas de passer outre.

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    En effet, ça fonctionne.

    Il me lance bien une FieldAccessException.

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Maintenant, est-ce qu'il est possible de donner à une assembly particulière la possibilité de passer outre cette sécurité ?

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Par défaut
    Ca depasse de loin ce que je sais. Cependant la MSDN a tout un chapitre sur les securité de reflection, je pense que tu y trouveras ton bonheur (ca à l'air ... copieux =) ).

    Bon courage.

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Par défaut
    Peut être si les deux assembly sont friend, mais, honnêtement, je n'en sais rien du tout.

    Personnellement je trouve cette possibilitéz d'accéder aux méthodes privées assez confortable.
    Je m'en sers, par exemple, pour avoir une implémentation générique du design pattern singleton, qui me permet de forcer un singleton à l'être "structurellement" (constucteur privé obligatoire) et évite de coder systématiquement le "getinstance" dans ce type de classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
       public sealed class Singleton<T> where T : class
        {
            private static volatile T _instance;
            private static readonly object _lock = new Object();
            /// <summary>
            /// Initializes a new instance of the class.
            /// </summary>
            private Singleton() { }
     
            static private C callPrivateConstructor<C>() where C : class
            {
                Type typ = typeof(C);
                ConstructorInfo constructorInfo = typ.GetConstructor(BindingFlags.Instance | BindingFlags.NonPublic, null, Type.EmptyTypes, null);
                // private constructor not found, throw exception
                return (C)constructorInfo.Invoke(null);
            }
            /// <summary>
            /// Gets object instance.
            /// </summary>
            public static T Instance
            {
                get
                {
                    if (_instance == null)
                    {
                        lock (_lock)
                        {
                            if (_instance == null)
                            {
                                _instance = callPrivateConstructor<T>();
                            }
                        }
                    }
                    return _instance;
                }
            }
        }

  9. #9
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    En fait, ça marche pas :

    J'ai une assembly A et une assembly B.

    J'ai marqué l'assembly A avec l'attribut [assembly: ReflectionPermission(SecurityAction.RequestRefuse, Unrestricted = true)].

    Mon assembly B tente via reflection de faire un SetValue sur un membre privé de la classe A1 de A et ça fonctionne malheureusement.

Discussions similaires

  1. Accès aux méthodes privées d'une classe par la reflection
    Par Aurazed dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 07/07/2008, 15h41
  2. [Reflection] Exécuter une méthode donnée d'une classe
    Par schousso dans le forum API standards et tierces
    Réponses: 4
    Dernier message: 03/06/2004, 10h35
  3. [Reflection]Probleme d'InstantiationException
    Par guipom dans le forum API standards et tierces
    Réponses: 6
    Dernier message: 23/05/2004, 23h28
  4. [Reflection][Bean] Appel d'une méthode dynamiquement
    Par eraim dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/04/2004, 11h07
  5. Reflections
    Par Laurent Gomila dans le forum DirectX
    Réponses: 4
    Dernier message: 25/07/2003, 14h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo