【发布时间】:2018-10-25 14:10:29
【问题描述】:
在反汇编我的 C# 程序(发布版本)时,我注意到它包含了我在项目中使用的函数名称和变量(我认为这是调试信息,如果我错了,请纠正我)。
有人能解释一下为什么会出现,以及程序是否需要它。
【问题讨论】:
-
类型和成员的名称当然会保留在编译的程序集中。此外,您可以选择将 pdb 文件与您的程序集一起部署或不部署,无论它是调试版本还是发布版本。您应该始终包含 pdb 文件以获取更详细的例外情况。
-
如果你在谈论字段/属性/方法,那你就错了。这不是调试信息,而是在 CLR 中启用(后期)绑定和反射的必要元数据...
-
类和成员的名称不是调试信息——.NET(托管)语言总是依赖于可用的反射元数据,不像像 C 这样的语言,其中的东西被分解成最低的机器如果省略调试信息,则没有更多数据的组件。局部变量名称是一种调试信息,因为有意义的名称是可选的(并且不能反映),但编译器仍然选择包含它们。诸如混淆器之类的第三方工具可以将名称更改为“无意义”的名称,但它们不能彻底删除元数据,因为 .NET 需要它。
-
.NET 语言被编译为 CIL,它仍然包含原始名称。也许您想了解一下。
标签: c# .net disassembly