Quiero generar IL para una aplicación multiproceso. Como el primer paso escribí una aplicación simple e inspeccioné, generé IL utilizando ILSpy.Generando IL para métodos anónimos
public class ThreadTesting
{
public static void Main()
{
Thread thread = new Thread(() => Print("Hello from t!"));
thread.Start();
}
public static void Print(string message)
{
Console.WriteLine(message);
}
}
.method public hidebysig static
void Main() cil managed
{
// Method begins at RVA 0x2060
// Code size 46 (0x2e)
.maxstack 3
.entrypoint
.locals init (
[0] class [mscorlib]System.Threading.Thread
)
IL_0000: nop
IL_0001: ldsfld class [mscorlib]System.Threading.ThreadStart ThreadTesting::'CS$<>9__CachedAnonymousMethodDelegate1'
IL_0006: brtrue.s IL_001b
IL_0008: ldnull
IL_0009: ldftn void ThreadTesting::'<Main>b__0'()
IL_000f: newobj instance void [mscorlib]System.Threading.ThreadStart::.ctor(object, native int)
IL_0014: stsfld class [mscorlib]System.Threading.ThreadStart ThreadTesting::'CS$<>9__CachedAnonymousMethodDelegate1'
IL_0019: br.s IL_001b
IL_001b: ldsfld class [mscorlib]System.Threading.ThreadStart ThreadTesting::'CS$<>9__CachedAnonymousMethodDelegate1'
IL_0020: newobj instance void [mscorlib]System.Threading.Thread::.ctor(class [mscorlib]System.Threading.ThreadStart)
IL_0025: stloc.0
IL_0026: ldloc.0
IL_0027: callvirt instance void [mscorlib]System.Threading.Thread::Start()
IL_002c: nop
IL_002d: ret
} // end of method ThreadTesting::Main
I fue capaz de generar más de los anteriores códigos de IL utilizando System.Reflection.Emit espacio de nombres.
Desafortunado No pude averiguar cómo generar siguiendo el código IL utilizando System.Reflection.Emit.
IL_0001: ldsfld class [mscorlib]System.Threading.ThreadStart ThreadTesting::'CS$<>9__CachedAnonymousMethodDelegate1'
Así puede alguien ayudarme a averiguar cómo generar IL para los métodos anónimos?
El almacenamiento en caché es quizás aún más importante que el uso de emit - pero si nunca va a ser reutilizado no hay razón para almacenarlo. –
@Marc, suponía que tanto el método anónimo como el método que lo utiliza se generan con emitir. En ese caso, creo que el almacenamiento en caché no ayuda mucho, ya que guarda solo una llamada al constructor delegado. Si el almacenamiento en caché no significa generar todo el método nuevamente, entonces, por supuesto, tienes razón. – svick