MSIL et chargement d'argument

sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 - 21 mars 2006 à 19:11
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 - 22 mars 2006 à 10:19
.method private hidebysig instance void Trucage(class Mouarf.IMangousteAQuatreCuls mangouste) cil managed
{
// Code size 9 (0x9)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.1
IL_0002: callvirt instance void TestReflectPerf.IMangousteAQuatreCuls::Action()
IL_0007: nop
IL_0008: ret
} // end of method A::Trucage

si quelqu'un sait pourquoi la decompilation de ma methode me donne ca, ou est l'argument 1 ???

en fait je viens de faire un test avec ldarg.3 et ca fonctionne aussi :S
si quelqu'un sait pourquoi, j'aimerais savoir

merci d'avance :)

3 réponses

sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
21 mars 2006 à 19:12
peut-etre plus claire comme ca, l'avatare ne gene plus


.method private hidebysig instance void Trucage(class Mouarf.IMangousteAQuatreCuls mangouste) cil managed
{
// Code size 9 (0x9)
.maxstack 8
IL_0000: nop
IL_0001: ldarg.1
IL_0002: callvirt instance void TestReflectPerf.IMangousteAQuatreCuls::Action()
IL_0007: nop
IL_0008: ret
} // end of method A::Trucage

si quelqu'un sait pourquoi la decompilation de ma methode me donne ca, ou est l'argument 1 ???

en fait je viens de faire un test avec ldarg.3 et ca fonctionne aussi :S
si quelqu'un sait pourquoi, j'aimerais savoir

merci d'avance :)
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
22 mars 2006 à 00:48
L'argument 1 est Mouarf.IMangousteAQuatreCuls mangouste. Si il y avait ldarg.0 tu aurais charger ton objet courant (classe).

Les arguments commencent à 1 pour les méthodes d'instances. Les instructions LD chargent sur la pile.

La tu charges quelquechose que tu n'utilises apparemment pas ,(mangouste).

Quand tu ldarg.3, il doit probablement charger null sur ta pile et comme de toute manière tu ne t'en sers pas , ton programme marche.

Mais je ne suis pas expert MSIL.

::|The S@ib|::
MVP C#.NET
0
sebseb42 Messages postés 495 Date d'inscription dimanche 6 juillet 2003 Statut Membre Dernière intervention 9 novembre 2007 1
22 mars 2006 à 10:19
biensure que si je m'en sert, se que je charge sur la pile sert pour l'appel de la fonction action

la fonction Action contient un appel a une MessageBox, et cette messagebox est bien appeler, meme si je met Ldarg.3, c'est ca qui est louche.

IL_0001: ldarg.1 // <-- ici est charger mon parametre pour l'appel de la ligne du dessous
IL_0002: callvirt instance void TestReflectPerf.IMangousteAQuatreCuls::Action()

effecticvement, apres une bonne dose de tests, et certains tutoriaux, il semble que l'argument 0 soit bien le this (pour une method non static).

cependant le code que j'ai copier coller fonctionne aussi avec Ldarg.0...

bref, c'est louche, mais au moins j'ai ma reponse, merci tout de meme pour ta participation, et ta confirmation, qui m'eclaire d'avantage :)
0
Rejoignez-nous