我想爲多線程應用程序生成IL。作爲第一步 我寫了一個簡單的應用程序,並使用ILSpy檢查,生成了IL。爲匿名方法生成IL
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
我能夠生成最使用System.Reflection.Emit 命名空間上述IL代碼。
不幸我不知道如何使用System.Reflection.Emit在IL代碼後生成 。
IL_0001: ldsfld class [mscorlib]System.Threading.ThreadStart ThreadTesting::'CS$<>9__CachedAnonymousMethodDelegate1'
所以能有人幫助我弄清楚 如何產生IL匿名方法?
緩存可能是更重要的使用排放 - 但如果它永遠不會被重用,那麼確實沒有理由存儲它。 –
@Marc,我假設匿名方法和使用它的方法都是使用emit生成的。在這種情況下,我認爲緩存沒有什麼幫助,因爲它只保存一個對委託構造函數的調用。如果不緩存意味着再次生成整個方法,那麼當然你是對的。 – svick