如何识别 DLL 是调试版本还是发布版本(在 .NET 中)[重复]

2023-11-25

可能的重复:
如何判断 .NET 应用程序是在 DEBUG 还是 RELEASE 模式下编译的?

我确信以前有人问过这个问题,但是谷歌和SO搜索让我失败了。

如何识别 DLL 是发布版本还是调试版本?


恕我直言,上述应用程序确实具有误导性;它只查找 IsJITTrackingEnabled,它完全独立于代码是否经过编译以进行优化和 JIT 优化。

如果您在发布模式下编译并选择 DebugOutput 为“none”以外的任何值,则 DebuggableAttribute 会出现。

您还需要定义exactly“调试”与“发布”是什么意思?

您的意思是该应用程序配置了代码优化吗? 您的意思是可以将 VS/JIT 调试器附加到它吗? 你的意思是它生成 DebugOutput 吗? 您的意思是它定义了 DEBUG 常量吗?请记住,您可以使用 System.Diagnostics.Conditional() 属性有条件地编译方法。

恕我直言,当有人问程序集是“调试”还是“发布”时,他们真正的意思是代码是否经过优化......

那么,您想手动还是以编程方式执行此操作?

Manually: 您需要查看程序集元数据的 DebuggableAttribute 位掩码的值。操作方法如下:

  1. 在 ILDASM 中打开装配体
  2. 打开清单
  3. 查看 DebuggableAttribute 位掩码。如果 DebuggableAttribute 不存在,则它肯定是一个优化的程序集。
  4. 如果存在,请查看第 4 个字节 - 如果它是“0”,则它是 JIT 优化的 - 其他任何字节都不是:

// 元数据版本:v4.0.30319 .... // .custom 实例 void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 020000 00 00 00 )

以编程方式:假设您想以编程方式了解代码是否经过 JITOptimized,以下是正确的实现(在简单的控制台应用程序中):

void Main()
{
    var HasDebuggableAttribute = false;
    var IsJITOptimized = false;
    var IsJITTrackingEnabled = false;
    var BuildType = "";
    var DebugOutput = "";
    
    var ReflectedAssembly = Assembly.LoadFile(@"path to the dll you are testing");
    object[] attribs = ReflectedAssembly.GetCustomAttributes(typeof(DebuggableAttribute), false);

    // If the 'DebuggableAttribute' is not found then it is definitely an OPTIMIZED build
    if (attribs.Length > 0)
    {
        // Just because the 'DebuggableAttribute' is found doesn't necessarily mean
        // it's a DEBUG build; we have to check the JIT Optimization flag
        // i.e. it could have the "generate PDB" checked but have JIT Optimization enabled
        DebuggableAttribute debuggableAttribute = attribs[0] as DebuggableAttribute;
        if (debuggableAttribute != null)
        {
            HasDebuggableAttribute = true;
            IsJITOptimized = !debuggableAttribute.IsJITOptimizerDisabled;
            
            // IsJITTrackingEnabled - Gets a value that indicates whether the runtime will track information during code generation for the debugger.
            IsJITTrackingEnabled = debuggableAttribute.IsJITTrackingEnabled;
            BuildType = debuggableAttribute.IsJITOptimizerDisabled ? "Debug" : "Release";

            // check for Debug Output "full" or "pdb-only"
            DebugOutput = (debuggableAttribute.DebuggingFlags &
                            DebuggableAttribute.DebuggingModes.Default) !=
                            DebuggableAttribute.DebuggingModes.None
                            ? "Full" : "pdb-only";
        }
    }
    else
    {
        IsJITOptimized = true;
        BuildType = "Release";
    }

    Console.WriteLine($"{nameof(HasDebuggableAttribute)}: {HasDebuggableAttribute}");
    Console.WriteLine($"{nameof(IsJITOptimized)}: {IsJITOptimized}");
    Console.WriteLine($"{nameof(IsJITTrackingEnabled)}: {IsJITTrackingEnabled}");
    Console.WriteLine($"{nameof(BuildType)}: {BuildType}");
    Console.WriteLine($"{nameof(DebugOutput)}: {DebugOutput}");
}

我在我的博客上提供了这个实现:

如何判断程序集是调试还是发布

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何识别 DLL 是调试版本还是发布版本(在 .NET 中)[重复] 的相关文章

  • 如何在 Windows 窗体上显示 ClickOnce 版本号

    我有一个部署到两个不同位置的 Windows 窗体应用程序 内联网 ClickOnce Internet 通过 Windows 安装程序安装在 Citrix 场上 我显示单击一次部署版本的 ClickOnce 版本号ApplicationD
  • 如何在 C# 中知道 PID 和 VID 来发现虚拟 COM 端口名称

    如果我知道 PID 和 VID 我会尝试找到查找 COM 端口名称的正确方法 到目前为止 我写了解决方法 但我不相信没有更优雅和正确的方法 顺便说一句 我知道我可以使用 REGEX 编写此代码只是为了测试解决方法 我知道还有很大的改进空间
  • & 运算符的含义是什么?

    在下面的代码中 Expression
  • Keyboard.Focus(item) 和 item.Focus() 有什么区别?

    在 WPF 中 有两种方法将焦点设置到元素 您可以调用输入元素的 Focus 方法 也可以使用输入元素作为参数调用 Keyboard Focus first way item Focus alternate way Keyboard Foc
  • .NET - 将颜色名称字符串转换为 System.Drawing.Color

    将 red green yellow aliceblue 等字符串转换为实际的 System Drawing Color 值的最佳方法是什么 我正在查看反思 发现有些事情似乎不对劲 您可以使用 Color FromName
  • 如何使用完全空的类型使 Activator.CreateInstance 运行速度减慢约 20 倍

    Given NET 程序集命名expression host NET 程序集命名CreateInstanceTest CreateInstanceTest 在其配置文件中启用 NetFx40 LegacySecurityPolicy exp
  • 在模块 CommonLanguageRuntimeLibrary 中找不到类型 System.ApplicationException

    我通过 CodenameOne 版本的 IKVM 运行了第 3 方 Android 库 并成功导入了输出 dll 作为对 Visual Studio 中的 UWP 应用程序的引用 在尝试编译该项目时 我收到一个构建错误 从错误列表窗口 在模
  • 使用隐式转换运算符的 Nullable 行为的理由是什么

    我在人与人之间的互动中遇到了一些有趣的行为Nullable和隐式转换 我发现为引用类型提供从值类型的隐式转换它允许Nullable当我期望出现编译错误时 类型将传递给需要引用类型的函数 下面的代码演示了这一点 static void Mai
  • 0xc000007b“应用程序无法正确启动”错误?

    我在 Visual Studio 2019 中编写了一个 C 控制台应用程序 并尝试将其部署到另一台 Windows 笔记本电脑 两台笔记本电脑均运行最新的 64 位 Windows 10 我的目标笔记本电脑已安装 最新的 NET Fram
  • 是否可以获取.NET调用堆栈中每个帧的参数值

    我说的是托管 NET 代码 如果我们运行任何程序并将 VS 附加到它 我们可以看到调用堆栈中每个方法的参数值 我想创建一个日志记录解决方案 它将记录调用堆栈中每个方法的所有参数值 实际上我需要这些信息以防发生异常 我知道通过分析 API 可
  • 如何从一堆图像生成视频?

    谁能告诉我从一堆图像 位图 生成视频的方法 可能是开放格式的avi文件或开源库 我使用了 Splicer 但它在生产使用中存在一些错误 字节数图像转视频 SDK http bytescout com products developer i
  • 集成到 Windows 资源管理器上下文菜单中

    我想写一个小工具 它可以执行以下操作 当您右键单击具有特定文件扩展名的文件时 Windows 资源管理器上下文菜单会显示一个附加条目 当您单击此条目时 将启动某个 EXE 并以此文件作为其参数之一 我想为此使用 C NET 2 0 如果不可
  • 执行多个查询时如何保持连接打开?

    我正在使用多个查询从应用程序中的同一服务器提取数据 问题是每次有新查询时我都必须打开一个新连接 是否有可能 打开连接 运行查询 拉取结果 运行另一个查询 拉取另一个结果 运行最终查询 拉取另一个结果 关闭连接 尽管您可能还不知道 但您的做法
  • 最好的 NHibernate 二级缓存提供程序是什么?

    我见过有很多这样的 NCache Velocity 等等 但我还没有找到比较它们的表格 考虑以下标准什么是最好的 容易明白 最近正在维护中 是免费的或者有足够好的免费版本 Works 我无法说出什么是最好的或最差的 但我会分享我使用 NCa
  • 无法在 .js 文件内命中断点

    我升级到 win 8 现在我在管理员权限下运行 VS 2012 并在 MVC 4 中创建一个网站 我在线检查了不同的解决方案 但没有一个有效 我的解决方案中有一个 javascript 文件 但是当我在其中放置断点时 在运行时我看到 没有为
  • 管理多个解决方案中存在的 C# 项目的 Nuget 包

    我现在正处于这样的阶段重构疯狂一个有很多的大项目遗留和不稳定的模块 我决定拆分解决方案目前 所有项目 大约有 20 个 而且由于下个月肯定会出现单元测试项目 还会有更多 链接在一起 使其更加独立和细化 通过这种方法 有一些模块 例如需要在多
  • 字典的线程安全

    如果我有一个 Dictionary
  • 运行命令行进程并在该进程仍在运行时获取输出?

    如何运行命令行进程并在该进程仍在运行时获取输出 我的意思是使用自己的进度条运行 CLI 进程 可执行文件本身需要很长时间才能完成操作 所以我想从自己的进程中获取进度信息来显示我的应用程序中的进度 否则我不这样做在进程完成之前没有任何信息来显
  • C# 从整数反序列化枚举

    是否可以从 C 中的 int 反序列化枚举 例如如果我有以下课程 class Employee public string Name get set public int EmployeeTypeID get set 我可以轻松地从 XML
  • 为什么泛型 IList<> 不继承非泛型 IList

    IList

随机推荐

  • iframe 动态创建后无缘无故消失

    这很难解释 但我以前从未经历过这样的事情 我还创建了一个 GIF 来显示问题的情况 我第一次打开 chrome 扩展程序并进行搜索时 iframe 工作得很好 第二次我打开 chrome 扩展并进行搜索时 iframe 消失了 参见 GIF
  • android ics 边缘褪色不起作用

    不知怎的 褪色边缘似乎不适用于 android ics android 4 的自己的视图 如果我在较低的 Android 版本上测试此布局 它会绘制褪色边缘 但在 Android 4 1 上则不会
  • ffmpeg 版本 2.6.8:filtergraph 描述中的流说明符 ':a' 不匹配任何流

    我不明白为什么这不起作用 我尝试使用 0 v 0 1 0 v 0 获取视频流和使用 0 a 获取音频流 0 0 0 0 0 没有任何作用 解释输入 第 1 1 个输入流是一个可以具有不同分辨率的视频 过滤器在其上添加填充以使其达到 600
  • 如何通过 $lookup 对“已加入”集合执行 $text 搜索?

    我是 Mongo 的新手 使用 v3 2 我有 2 个系列 父母 和 孩子 我想使用 Parent aggregate 并使用 lookup 加入 Child 然后在 Child 中的字段上执行 text search 并在父项上执行日期范
  • Amazon Data Pipeline:如何在 SqlActivity 中使用脚本参数?

    尝试在 sqlActivity 中使用脚本参数时 id ActivityId 3zboU schedule ref DefaultSchedule scriptUri s3 location of script unload sql nam
  • 与 VB.NET 相比,为什么 IntelliSense 对 C# 的支持缺乏? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 对我来说 为 Java 生
  • 如何使用 C 套接字进行 ping 操作

    编译器 代码 块 GNU GCC 平台 Windows x86 包括 winsock h Winsock2 h ws2 32 也已链接 我目前正在尝试编写一个程序 该程序将读取包含 IP 地址列表的文本文件并分别 ping 每个 IP 地址
  • 从查询结果中选择随机结果样本

    这个问题询问如何在 SQL Server 上获取随机的记录样本 答案是使用TABLESAMPLE Oracle 10 中有等效的吗 如果没有 是否有一种标准方法可以从查询集中获取结果的随机样本 例如 如何从正常情况下返回数百万行的查询中获取
  • 为什么 Maven 每次都下载 maven-metadata.xml?

    下面是当我尝试使用 Maven 构建 Web 应用程序时 当我的互联网连接不稳定时 我通常会遇到的错误 我的问题是 为什么 Maven 每次都必须在较早构建同一个应用程序时下载 我的配置可能有什么问题导致 Maven 每次都下载 以下是我尝
  • 如何使用 MongoDB 跟踪私人消息系统?

    以 Facebook 的私人消息系统为例 您必须跟踪发送者和接收者以及消息内容 如果我使用 MySQL 我会有多个表 但使用 MongoDB 我会尽量避免这一切 我正在尝试提出一个可以扩展且易于维护的 良好 模式 如果我使用 mysql 我
  • 使用径向基函数在球体上插值函数

    首先 介绍一下背景 我使用球谐函数作为球体表面上的函数示例 如下图中的前球体所示 我制作了其中一个球体 根据其表面各点的调和函数值进行着色 我首先对大量点执行此操作 因此我的函数非常准确 我把这称为我的fine领域 现在我有了我的fine球
  • 为什么必须“导入”Python 标准库函数? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我是 Python 编码新手 并且有 PHP 背景 我很好奇为什么你必须在 python 脚本顶部 导入 函数 在 PHP 中 您可以简单地使用以下函数 sleep 10 以上将
  • 不知道如何构建任务“db:create”

    我正在从 sqlite 数据库迁移到 mysql2 我正在运行 mysql 并更改了database yml 但由于某种原因 我的 rake db create 返回了 rake aborted Don t know how to buil
  • JSF 2 上的 https,用于受保护的资源和登录

    我有一个具有 2 个属性的托管 bean userName password 及其各自的 getter 和 setter 方法 以及login 访问数据库以验证登录凭据的方法 我的问题是 当用户单击 登录 按钮时 该操作必须通过 https
  • 在 select2 多选中加载值

    我在用着select2代替搜索框 在这里我用来加载这样的国家值 countries select2 multiple true tags India Japan Australia Singapore tokenSeparators 当我按
  • AngularJS/Jade 错误:参数“MyController”不是函数,未定义(MEAN)

    我知道这个问题的变体已经被问过好几次了 但是我已经尝试了其他OP的几种建议解决方案 但无法解决这个问题 并且希望得到一些澄清 我正在使用基本的平均待办事项列表应用程序 http www mean io 实现一个简单的控制器后 我遇到了 错误
  • 我可以在 jQuery 模板中声明本地/临时变量吗?

    是否可以在 jQuery 模板语法中声明新变量 我希望能够达到与此相当的效果 这不起作用 var test test div test div 我知道这已经得到回答并接受 但这是另一个解决方案 data localVariable SOME
  • 为什么我通过 spawn() 创建的 Node 子进程挂起?

    我正在使用 spawn 进行 git 调用 有时它工作正常 但有时它似乎挂起 我没有看到任何事件触发 错误 退出 关闭 但我看到有证据表明该过程实际上已成功完成 var spawn require child process spawn s
  • 无法将内容添加到新的 Plone 站点:ValueError:无法找到 update_version_before_edit 异常

    刚刚使用统一安装程序在 CentOs 上成功安装了 Plone 4 2 1 登录后我无法添加任何内容 我收到以下错误 Traceback innermost last Module ZPublisher Publish line 126 i
  • 如何识别 DLL 是调试版本还是发布版本(在 .NET 中)[重复]

    这个问题在这里已经有答案了 可能的重复 如何判断 NET 应用程序是在 DEBUG 还是 RELEASE 模式下编译的 我确信以前有人问过这个问题 但是谷歌和SO搜索让我失败了 如何识别 DLL 是发布版本还是调试版本 恕我直言 上述应用程