2010-10-12 2 views
5


Comment obtenir le pointeur de fonction utilisé pour construire un délégué en C#?obtenir le pointeur de fonction 'ldftn' dans C#

+0

Voulez-vous l'adresse du pointeur brut, ou voulez-vous juste un objet délégué dans une variable? – siride

+0

le pointeur de fonction utilisé pour appeler le .ctor (c'est-à-dire .ctor (objet, [native int])) – Kii

+1

Il est assez difficile de savoir de quel ctor vous parlez. La valeur _methodPtr ne peut être générée que par le compilateur JIT. Il n'y a rien à appeler jusqu'à ce qu'il génère le code machine pour la méthode. –

Répondre

5

Votre question est formulée d'une manière qui rend difficile à comprendre ce que vous essayez réellement de faire. Je pense que peut-être ce que vous voulez est quelque chose comme ceci:

MethodInfo mi = ... 
var ptr = mi.MethodHandle.GetFunctionPointer(); 
// now call a delegate .ctor using that ptr 
3

Si vous cherchez comment le code Reflection.Emit devrait ressembler, alors quelque chose comme ceci:

il.Emit(OpCodes.Ldftn, yourMethodInfo); 
il.Emit(OpCodes.Newobj, yourDelegateType.GetConstructors()[0]); 

La première ligne charge le pointeur de fonction sur la pile. La deuxième ligne "le passe" au constructeur du délégué. yourDelegateType devrait être quelque chose comme typeof(Func<string>), etc

+0

Oui, c'est un moyen de créer un délégué dans Reflection.Emit. Mais je veux seulement le pointeur de fonction, c'est-à-dire la sortie de ldftn – Kii

+1

@Kii, que voulez-vous faire avec? Pouvez-vous fournir un code (pseudo) qui illustre ce que vous aimeriez accomplir? –

+0

une fois, il existe une méthode: objet create_object (objet [] args) alors je veux créer un délégué par la méthode: objet _delegate = create_object (nouvel objet [] {null, get_ptr (method_info)}); – Kii