Je voulais essayer comment le System.Reflection.Emit
fonctionne, mais finalement j'ai empilé avec un problème. Je voulais créer (en utilisant Emit
) une classe simple, comme ceci:C#, reflection.emit essayant dur
using System;
namespace emit
{
class Builder
{
private String name;
public Builder(String builderName)
{
name = builderName;
}
public override int GetHashCode()
{
return name.GetHashCode();
}
public override string ToString()
{
return this.name;
}
}
}
Je suis passé par quelques tutoriels et j'ai réussi à créer la bibliothèque dynamique. J'ai sauvegardé cette bibliothèque sur mon disque puis je l'ai chargée en utilisant la réflexion. J'ai été capable de filtrer ses types, constructeurs et méthodes. J'ai également invoqué avec succès le constructeur en passant string
désiré. Pourtant, il y a un problème quand j'essaie d'invoquer l'une des méthodes - System.Reflection.TargetInvocationException
est lancé.
Voilà comment je GetHashCode()
mis en œuvre:
MethodBuilder mHashCode = tBuilder.DefineMethod("GetHashCode",
MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.Virtual,
CallingConventions.HasThis, typeof(System.Int32), null);
mHashCode.SetImplementationFlags(MethodImplAttributes.Managed);
ILGenerator mHashGenerator = mHashCode.GetILGenerator();
MethodInfo defaultHashCode = typeof(object).GetMethod("GetHashCode");
mHashGenerator.Emit(OpCodes.Ldfld, simpleName);
mHashGenerator.Emit(OpCodes.Callvirt, defaultHashCode);
mHashGenerator.Emit(OpCodes.Ret);
tBuilder
est TypeBuilder
que je crée.
Après avoir enregistré l'assemblage et la recherche dans avec ILDSASM
il est comme:
Malheureusement, cette méthode ne sera pas invoquer. Voici le code:
Type dType = asm.GetTypes()[0];
ConstructorInfo dConstructor = dType.GetConstructor(new Type[] { typeof(string) });
object dObject = dConstructor.Invoke(new object[] { "Pawel" });
MethodInfo[] dMethods = dType.GetMethods();
foreach(var mi in dMethods)
{
Console.WriteLine(mi.Name);
}
//method with `0` index is `GetHashCode()`
dMethods[0].Invoke(dObject, null);
Est-ce que quelqu'un a une idée de ce que je pourrais faire de mal?
Quelle est l'exception intérieure du TargetInvocationException? – stuartd
C'est quelque chose comme "CLR Environment a capturé un programme inapproprié". StackTrace montre que 'BuilderEmitType.GetHashCode()' provoque cela. –