2009-08-31 15 views
13

Sto eseguendo il debug di un programma (VS2008) e stavo scavalcando linee di codice. Mi sono imbattuto in una riga in cui veniva chiamata una funzione delegata e ho cercato di intervenire. Tuttavia, piuttosto che entrare nel metodo come mi aspettavo, il metodo è stato aggirato, con il debugger che invece passa a quello che presumo sia una funzione chiamata dal delegato. Nello stack di chiamate, la riga in cui mi aspettavo che il metodo delegato fosse disattivata con il testo [Lightweight Function]."[Funzione leggera]" nello stack di chiamate

Che cosa significa la parte "Funzione leggera"? C'è un modo per entrare in questa funzione?

+16

Geez, il primo Visual Studio mi dice che "questo codice è stato generato da uno strumento" e ora chiama le mie funzioni "leggero"? Che atteggiamento! :) –

+0

Controlla le impostazioni di compilazione, forse le ottimizzazioni sono abilitate e le funzioni possono essere ottimizzate (in linea) – CodingBarfield

risposta

12

Credo che una funzione leggera si riferisce a uno DynamicMethod, ad esempio uno che viene emesso in fase di runtime, utilizzato e quindi scaricato.

Questo post del blog è correlato a Iron Python, ma le informazioni dovrebbero essere valide per qualsiasi progetto .NET: Viewing Emitted IL. L'autore mostra come utilizzare un debugger di livello inferiore (windbg.exe) per vedere queste "funzioni leggere".

3

Sembra che questo sia un DynamicMethod. Vedi this per alcuni approfondimenti.

Non sono sicuro di passare a un metodo dinamico, però.

2

Callstack per DynamicMethod (sia in Debug e Release modalità):

[Lightweight Function] 
[Native to Managed Transition] 
mscorlib.dll!System.Reflection.Emit.DynamicMethod.Invoke(object obj, System.Reflection.BindingFlags invokeAttr, System.Reflection.Binder binder, object[] parameters, System.Globalization.CultureInfo culture) + 0x199 bytes 

Pure

[Funzione Leggero]

telaio può essere osservata quando un delegato a un metodo dinamico è chiamato.

Problemi correlati