gpt4 book ai didi

.net - 为匿名方法生成 IL

转载 作者:行者123 更新时间:2023-12-04 17:27:13 27 4
gpt4 key购买 nike

我想为多线程应用程序生成 IL。作为第一步
我编写了一个简单的应用程序并使用 ILSpy 检查并生成了 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?

最佳答案

IL 只是编译器缓存委托(delegate)实例的方式——它不是方法本身的一部分。如果您正在使用 DynamicMethod(您可能应该使用),那么只需调用 CreateDelegate({your delegate type}),将其转换为您想要的委托(delegate)类型(可能是 ThreadStart),并将(类型化的)委托(delegate)实例存储在任何地方。

关于.net - 为匿名方法生成 IL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6801462/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com