Appeler une méthode private d'une classe internal à partir d'une autre assembly

Soyez le premier à donner votre avis sur cette source.

Vue 11 973 fois - Téléchargée 299 fois

Description

La reflection offre des possibilités immenses ! Dans certains cas on aimerais bien appeller des méthodes private / internal contenus dans une autres assembly, généralement dans le framework.

Malheureusement par définition une classe internal ne peut pas être appellé en dehors de son assembly.

Voici alors une astuce utilisant la reflection qui nous permet d'appeller une méthode private d'une classe internal d'un autre assembly.

La solution joint dans le zip se compose de 2 projets : une application console et un projet Class Library, dans le class Library j'ai une class internal avec une méthode private. Dans l'application console j'appelle cette méthode private :-)

Source / Exemple :


static void Main(string[] args)
        {

            // On récupere le type qui nous intéresse 
            Type t = Type.GetType("ClassLibrary2.Toto, ClassLibrary2");

            // On récupere le constructeur de l'objet qui ne demande aucun paramètre
            ConstructorInfo constructor = t.GetConstructor(Type.EmptyTypes);

            // On appelle le constructeur de l'objet avec aucun paramètre
            Object obj = constructor.Invoke(null) ;

            // On obtient notre méthode Hello 
            // Reflector nous indique que c'est une méthode d'instance private donc on filtre notre recherche
            MethodInfo method = t.GetMethod("Hello" , BindingFlags.Instance | BindingFlags.NonPublic); 

            // On appelle la méthode avec aucun paramètre mais en passant l'objet auquel est rattaché la méthode 
            String result = (String)method.Invoke(obj, null);

            // On affiche le résultat 
            Console.WriteLine(result);
            Console.Read();
        }

Conclusion :


Cet exemple ne sert qu'a vous montrez les possibilités de la reflection, il existe beaucoup de variantes à cette méthode, je vous laisse découvrir les joies de la reflection par vous même :)

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Nikoui
Messages postés
794
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
19 août 2008
7 -
Bon exemple de la puissance de la réflexion... mais si on se met à appeler les méthodes privates, autant refaire du "C pas sharp" :)
FREMYCOMPANY
Messages postés
278
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
22 décembre 2008
-
Effrayant !
Vous vous imaginez un peu les conséquences que peuvent avoir ce genre d'astuces ?
Un petit malin savait déjà décompiler votre assembly en moins de 30 seccondes...
Pas vraiment top.
Si en plus on sait invoquer des fonctions privates dans des classes friend, bonjour les dégats....
C'est évidmenent bon à savoir, mais personnellement, je trouve que MS devrait un peu faire attention : un programme ne devrait pas se lire à livre ouvert ...

Merci en tout cas pour cette astuce très instructive !
Bon travail !
jesusonline
Messages postés
6827
Date d'inscription
dimanche 15 décembre 2002
Statut
Modérateur
Dernière intervention
13 octobre 2010
16 -
Bonjour,

on peut évidemment proteger tout ca, mais c'est le mode par défaut de .net ... tu retrouveras plus de détails techniques dans les commentaires de ce post : http://blogs.developpeur.org/cyril/archive/2006/06/22/Appeler_une_methode_private_d_une_classe_internal_dans_une_application_externe_c_est_possible.aspx

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.