Je passais en revue un article Dodge Common Performance Pitfalls to Craft Speedy Applications de Joel Pobar sur Reflection et je regardais un morceau particulier de code qui ne compile pas (légèrement modifié pour affiner l'erreur spécifique, parce que son exemple avait plus d'erreurs):Générer DynamicMethod à partir de MethodInfo
MethodInfo writeLine = typeof(Console).GetMethod("WriteLine");
RuntimeMethodHandle myMethodHandle = writeLine.MethodHandle;
DynamicMethod dm = new DynamicMethod(
"HelloWorld", // name of the method
typeof(void), // return type of the method
new Type[]{}, // argument types for the method
false); // skip JIT visibility checks
ILGenerator il = dm.GetILGenerator();
il.Emit(OpCodes.Ldstr, "Hello, world");
il.Emit(OpCodes.Call, myMethodHandle); // <-- 2 errors here
il.Emit(OpCodes.Ret);
Les erreurs sont les suivantes:
Program.cs(350,13): error CS1502: The best overloaded method match for 'System.Reflection.Emit.ILGenerator.Emit(System.Reflection.Emit.OpCode, byte)' has some invalid arguments
Program.cs(350,35): error CS1503: Argument '2': cannot convert from 'System.RuntimeMethodHandle' to 'byte'
Le ILGenerator
peut Emit
avec un MethodInfo
, mais il ne semble pas soutenir MethodHandle
... Quelqu'un savoir comment faire fonctionner cet échantillon?
ClassWrapper n'a même pas 'Load()' mon type: 'var classWrapperDescriptor = nouveau ClassWrapperDescriptor (typeof (MyDataContext));' 'classWrapperDescriptor.Load(); // renvoie une exception de référence nulle' –
Bonjour @Don P, pouvez-vous déposer un bug sur https://github.com/kendarorg/ClassWrapper (ou ajouter un commentaire ici) Avec la définition de la classe que vous essayez de charger? Merci pour l'aide! – EDR