如何识别 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 中)[重复] 的相关文章

  • 使用编译时编织进行依赖注入? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我只是想了解 PostSharp 老实说我认为它太棒了 但有一件事对我来说很难如何纯依赖注入 不是服务定位器 无法完成 https cod
  • 如何使用 PetaPoco 库自动从数据库创建模型?

    我的数据库中有一个表 我想为其创建一个带有 getter 和 setter 的模型类 对于我项目中的大部分任务 我使用 PetaPoco 我手动创建了模型 但很少有表有很多列 有没有办法使用 PetaPoco 从数据库创建模型 我强烈建议您
  • 在 .Net 中创建 EPUB

    有没有可以用来在 NET C 中创建 epub 文件的库 Flowdocument gt epub 转换工具将是理想的选择 但任何类型的库都很棒 我还对评估编写一个程序的复杂程度感兴趣 我知道它基本上是一堆压缩的 XHTML 文件 但我不断
  • 在c#中创建sql连接

    我是这个网站的新手 也是编程的新手 我目前正在通过销售点创建库存系统 它使用模态和非模态形式 我的问题是 我正在研究change password对话框必须连接到数据库才能覆盖密码字段 我使用的数据库是Microsoft SQL Serve
  • 如何从 SOAP 响应中删除额外的结果标签

    我知道这个问题以前曾被问过 但我在任何地方都找不到答案 问题是我的 asmx 文件中有以下代码 namespace IrancellSmsServer SoapDocumentService RoutingStyle SoapService
  • 为什么 ᏌᏊ ᎢᏳᎾᎵᏍᏔᏅ ᏍᎦᏚᎩ 是美国的本土名称?

    当我使用这段代码时 var ri new RegionInfo us var nativeName ri NativeName why is nativeName然后是字符串 in Cherokee https en wikipedia o
  • VS2017在nuget包中将“Build Action”设置为“Content”

    我创建我的nuget包在gitlab使用以下命令行 nuget pack Prop Configuration Release OutputDirectory nuget REPONAME APPNAME APPNAME csproj 如果
  • 生成Excel文件错误

    我在经典 ASP 中使用以下代码生成 Excel 文件 代码很简单并且有效 我在 Windows Vista x86 上的 IIS 7 0 下运行代码 两个问题 有一个奇怪的警告框 这是屏幕快照 http i27 tinypic com 2
  • 在我的网站上显示 Google Analytics(分析)仪表板

    我设置了一个 ASP NET 网站 并使用 Google Analytics 进行页面跟踪 我唯一不喜欢的是我必须离开我的网站 到 Google Analytics 网站 才能看到该报告 有什么方法可以使用他们拥有的所有 AJAX 在我自己
  • Microsoft Teams 中私人消息的传入 Webhook

    我可以从 C 应用程序或 PS 脚本创建传入 Webhook 将 JSON 消息发送到 MSFT 文档所解释的通道 但是 我想使用传入的 webhook 将 JSON 消息从我的应用程序发送到用户 作为私人消息 就像 Slack 允许的那样
  • 文件显示在 Visual Studio 的解决方案资源管理器中,并带有快捷方式图标。这意味着什么?

    我已经下载了FParsec的库源代码 所有文件都带有快捷方式符号 这是什么意思 当该项目添加到该项目时 它被添加为链接Project gt Add Existing Item gt Add as Link 该文件很可能托管在目录结构中的另一
  • 无法获取托管类型(“T”)的地址、获取其大小或声明指向托管类型的指针

    为什么哦为什么这是不允许的 private static unsafe byte ConvertStruct
  • 强制 Mpeg2 解复用器使用 ffdshow 渲染 H 264 数字电视视频

    不幸的是 我花了很多时间尝试使 DirectShow 的 DTVViewer 示例正常工作 但没有成功 DVBT网络的视频格式是H264 我发现IntelliConnect行为IFilterGraph更喜欢使用 Mpeg2 视频格式 对于那
  • .NET 中严格浮点数学的库

    我有 Java 算法 计算及其单元测试 单元测试期望结果具有一定的精度 增量 现在我将算法移植到 NET 中 并希望使用相同的单元测试 我使用双数据类型 问题在于 Java 使用 strictfp 64 位 来执行 Math 类中的某些操作
  • 使用C#属性来跟踪函数调用、变量和返回值?

    在Python中 我可以使用装饰器来跟踪函数调用 它的变量和返回值 这是非常容易使用 我只是想知道 C 可以做同样的事情吗 我发现网上有CallTracing Attribute的示例代码 然而 它并没有显示出我预期的结果 C 属性与 py
  • C 编程:seg 错误、printf 和相关的怪癖[重复]

    这个问题在这里已经有答案了 正如许多年轻的程序员所做的那样 我了解到在代码中的不同点插入大量 here1 here2 等打印到控制台语句的有用性 以找出我的程序何时出错 在我的计算机科学学习过程中 这种强力调试技术已经拯救了我很多很多次 然
  • 注销租约抛出 InvalidOperationException

    我有一个使用插件的应用程序 我在另一个应用程序域中加载插件 我使用 RemoteHandle 类http www pocketsilicon com post Things That Make My Life Hell Part 1 App
  • 从 make 文件中禁用 make 内置规则和变量

    我想根据传递禁用内置规则和变量 r and R options http www gnu org software make manual make html Options Summary从 make 文件内部到 GNU make 也欢迎
  • 使用接口有什么好处?

    使用接口有什么用 我听说它用来代替多重继承 并且还可以用它来完成数据隐藏 还有其他优点吗 哪些地方使用了接口 程序员如何识别需要该接口 有什么区别explicit interface implementation and implicit
  • C# 中的合并运算符?

    我想我记得看到过类似的东西 三元运算符 http msdn microsoft com en us library ty67wk28 28VS 80 29 aspx在 C 中 它只有两部分 如果变量值不为空 则返回变量值 如果为空 则返回默

随机推荐

  • 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 是发布版本还是调试版本 恕我直言 上述应用程