使用dnSpy反编译.NET代码时遇fieldof函数相关问题求助
处理dnSpy反编译出的MSIL
fieldof 特殊语句问题 先明确那些特殊标识的含义
<PrivateImplementationDetails>{D87A3940-7D04-49D9-B7B7-2971825FAF29}:这是C#编译器编译时自动生成的内部辅助类,用来存储编译期生成的隐式数据(比如匿名方法闭包、静态构造器辅助字段、语法糖底层实现结构等),GUID是该类的唯一标识,不同编译单元的此类GUID不同。$$method0x6000519-1:是上述内部类中的编译器自动分配字段,后缀的十六进制和数字是字段的唯一标识,对应原代码中某个隐式生成的方法相关结构(比如匿名方法的委托实例字段、方法元数据引用)。
查找并转换为合法C#的步骤
定位生成类与字段
在dnSpy的程序集浏览面板按Ctrl+F,搜索完整类名<PrivateImplementationDetails>{D87A3940-7D04-49D9-B7B7-2971825FAF29},找到后展开字段列表,定位$$method0x6000519-1字段,查看它的类型和定义。推断原代码逻辑
右键点击该字段,选择「查找所有引用」,查看它的调用上下文:- 若引用和匿名方法/Lambda有关:该字段大概率是编译器生成的委托实例字段,对应原代码中的匿名逻辑。
- 若和元数据读取有关:该字段是方法的元数据引用,对应原代码中获取方法信息的逻辑。
替换为合法C#代码
- 若是委托实例字段:直接写出原匿名方法/Lambda的代码逻辑,替换掉
fieldof引用。 - 若是方法元数据引用:用C#反射API实现,比如
typeof(目标类).GetMethod("目标方法名", BindingFlags.NonPublic | BindingFlags.Instance)(根据实际访问权限调整绑定标志)。 - 若是闭包相关字段:还原原闭包的上下文变量和逻辑,补全代码后替换掉
fieldof语句。
- 若是委托实例字段:直接写出原匿名方法/Lambda的代码逻辑,替换掉
额外技巧
调整dnSpy的反编译设置:开启「显示编译器生成的代码」选项,部分场景下dnSpy会自动将这些内部类的内容转换为更易读的C#代码,减少手动查找的工作量。
内容的提问来源于stack exchange,提问作者The one word assaulter
相关产品推荐
相关产品推荐

