Sei nella giusta direzione per sbarazzarsi dei "NOP" s:
Quando fornisci un argomento aggiuntivo per una chiamata Emit, assicurati sempre di verificare su MSDN il tipo di argomento appropriato.
Per OpCodes.Ldc_I4_S, MSDN afferma:
ldc.i4.s è una codifica più efficiente per la spinta degli interi da -128 a 127 sul> stack di valutazione.
Il seguente overload del metodo Emit è possibile utilizzare il codice operativo ldc.i4.s:
ILGenerator.Emit (OpCode, byte)
Quindi la seconda parte del codice avrà risultati imprevedibili (oltre a quelli fastidiosi nop) in fase di esecuzione, poiché si sta tentando di caricare un "int8" nello stack, ma fornendo un valore "int32" o "breve":
else if (IsBetween(value, short.MinValue, short.MaxValue))
{
gen.Emit(OpCodes.Ldc_I4_S, (short)value);
}
else
{
gen.Emit(OpCodes.Ldc_I4_S, value);
}
È necessario utilizzare Ldc_I4 anziché Ldc_I4_S se si desidera caricare correttamente uno stack int32/short (o qualcosa di maggiore di un byte). Quindi il codice dovrebbe essere simile al posto del campione di cui sopra:
else
{
gen.Emit(OpCodes.Ldc_I4, value);
}
Questo è un ipotesi, ma i tre NOP di che sono stati generati probabilmente hanno qualcosa a che fare con i byte in più dal vostro int32
Spero che sia d'aiuto ...
fonte
2011-11-15 09:23:52
Forse sta impacchettando le istruzioni in un blocco di una certa dimensione e riempendo il resto con i nops? – Joe
Come il NOP non fa male, perché vuoi liberarti di loro? – RichardOD
Se non ci sono motivi per cui sono lì, il codice C# risultante non ha alcun ... – Peter