Incuriosito da questo post di Paolo segnalatomi da Cristian, non ho resistito a fare qualche test.
Il problema l'ho potuto riscontrare anch'io e quindi ho cominciato a debuggare in assembler per vedere se c'erano differenze macroscopiche.
Per poter debuggare una versione release c'è il solito trucco di iniettare l'istruzione int 3 in assembler e così ho fatto con una micro dll di appoggio in C++. Immediatamente ho potuto riscontrare che il problema non si presentava più e sistematicamente ogni volta che tentavo di iniettare il codice il problema spariva.
Quindi mi è venuto il dubbio potesse essere un problema di passaggio parametri e quindi presunta 'colpa' del jitter.
Ecco quindi l'ovvio test successivo:
System.Type t = method.DeclaringType;
Assembly a = t.Assembly;
return(a);
// return(method.DeclaringType.Assembly);
Ecco quindi che spezzando in tre righe la return il problema sparisce. Ho anche provato ad inserire una Sleep o a iniettare dei nop assembler e tutte queste modifiche riportano sempre il risultato corretto.
La palla ripassa a Paolo :-) per capire se anche a lui sortisce lo stesso effetto.
Uno dei possibili passi successivi è quello di confrontare l'assembler corrispondente dalla versione originale e quello con la versione qui citata e confrontare il passaggio parametri, ma non si può iniettare codice assembler ed è già quasi l'una ;-)