Vous êtes dans la bonne direction pour se débarrasser des s "NOP":
Lorsque vous fournissez un argument supplémentaire à un appel Emit, assurez-vous toujours de vérifier sur MSDN le type d'argument approprié.
Pour OpCodes.Ldc_I4_S, MSDN indique:
ldc.i4.s est un codage plus efficace pour pousser les nombres entiers de -128 à 127 sur la pile d'évaluation>.
La surcharge de méthode Emit suivante peut utiliser l'opcode ldc.i4.s:
ILGenerator.Emit (OpCode, octet)
Ainsi, la deuxième partie de votre code aura des résultats imprévisibles (en dehors de ces satanés) à l'exécution, puisque vous essayez de charger un "int8" sur la pile, mais en fournissant une valeur "int32" ou "short":
else if (IsBetween(value, short.MinValue, short.MaxValue))
{
gen.Emit(OpCodes.Ldc_I4_S, (short)value);
}
else
{
gen.Emit(OpCodes.Ldc_I4_S, value);
}
Vous devez utiliser Ldc_I4 au lieu de Ldc_I4_S si vous voulez charger correctement un int32/short (ou n'importe quoi d'une plus grande magnitude qu'un octet) sur la pile. Donc, votre code devrait ressembler à ceci au lieu de l'exemple ci-dessus:
else
{
gen.Emit(OpCodes.Ldc_I4, value);
}
Ceci est une supposition sauvage, mais les trois années NOP qui ont été générés sans doute quelque chose à faire avec les octets supplémentaires de votre int32
Espérons que cela aide ...
Peut-être que c'est emballer les instructions dans un bloc d'une certaine taille et remplir le reste avec des nops? – Joe
Comme le NOP ne fait aucun mal, pourquoi souhaitez-vous vous en débarrasser? – RichardOD
Si elles ne servent à rien pourquoi les avoir là, le code C# résultant n'en a pas ... – Peter