c# - 为什么 C# 发布版本包含调试信息
问题描述
在反汇编我的 C# 程序(发布版本)时,我注意到它包含函数的名称和我在项目中使用的变量(我认为这是调试信息,如果我错了,请纠正我)。
有人可以解释为什么它在那里以及程序是否有必要。
解决方案
托管代码中存在三个级别的“调试信息”。
包含的元数据:这包括所有公开的命名空间、名称和类型(不包括局部变量名称之类的东西)。它被捆绑在程序集中,并允许该代码的使用者知道如何引用代码并引用它。在 C/C++ 领域,这一级别的元数据被放在H 文件中。在 COM 领域,您可以获得类型库。所有程序集都得到了这个——没有它就不能被消耗。
符号文件(又名PDB 文件)。这是关于内部名称、行号等的扩展信息。调试器使用这些信息来使调试工作更好。您可以为“调试构建”或“发布构建”(或其他类型的构建)创建 PDB 文件。这由可从项目属性的“构建”选项卡访问的“高级构建设置”对话框中的设置控制。默认情况下,发布版本设置为仅 PDB,而调试版本设置为完整(我相信这可能会将更多信息直接放入程序集中)。PDB 文件在托管代码中的重要性不如在 C/C++ 领域中的重要。在那里,如果没有匹配的 PDB 文件,调试几乎是不可能的。
定义DEBUG常量:(在项目属性的Build选项卡上设置)。此#defined 常量用作包含(或不包含)仅调试代码的开关。定义或不定义此常量时,代码的工作方式可能略有不同。
推荐阅读
- java - 可以考虑将此代码用于 Java 中的成员覆盖吗?
- r - 使用 RCall 将数据向量从 julia 导入到 R
- python - 通过计算 numpy 中的最大值找到最佳通道
- java - 我正在尝试使用适配器膨胀我的 recyclerview 活动
- azure - Microsoft Azure 导航 - 非技术
- .net - 当属性的类型和实例是第三方包的一部分时,如何将依赖注入用于插件的属性?
- android - 从 AWS S3 下载对象以在 Android 应用程序中使用的方法?
- c# - 方法参数智能
- flutter - 如何在下拉选择后使小部件可用?
- class - 在 Kotlin 中创建类时“get”覆盖的问题