C# 在.NET中调试与发布

C# 在.NET中调试与发布,c#,.net,asp.net,C#,.net,Asp.net,从我的开始,是否有一个全面的文档列出了C#应用程序(尤其是web应用程序)中调试和发布模式之间的所有可用差异 有什么区别?我不知道有一个简明的文档,但是: 调试。写调用在发行版中被剥离 在发行版中,由于优化,您的调用堆栈可能看起来有点“奇怪”,如 在调试模式下,使用GDI+绘图的速度要慢得多。发布版本: 是相当快的(最重要的)优化 无法调试(一步一步) 并且不包括用“debug”指令编写的代码 请参阅。“调试”和“发布”只是Visual Studio定义的预定义项目配置的名称。 要查看差异,请

从我的开始,是否有一个全面的文档列出了C#应用程序(尤其是web应用程序)中调试和发布模式之间的所有可用差异


有什么区别?

我不知道有一个简明的文档,但是:

  • 调试。写调用在发行版中被剥离
  • 在发行版中,由于优化,您的调用堆栈可能看起来有点“奇怪”,如

在调试模式下,使用GDI+绘图的速度要慢得多。

发布版本:

  • 是相当快的(最重要的)优化

  • 无法调试(一步一步)

  • 并且不包括用“debug”指令编写的代码

  • 请参阅。

    “调试”和“发布”只是Visual Studio定义的预定义项目配置的名称。
    要查看差异,请查看Visual Studio中项目属性中的“生成”选项卡

    <system.web>
        <compilation debug="true">
    
    VS2005的差异包括:

    • 调试配置中定义的调试常量

    • 优化版本配置中启用的代码

    以及通过点击“高级”按钮可以看到的其他差异

    但你可以:

    • 在项目属性/生成中更改调试和发布配置的生成设置

    • 通过右键单击解决方案资源管理器中的解决方案并选择Configuration Manager,创建您自己的自定义配置


    我认为DEBUG常量的行为相当清楚(可以在#if预处理器指令或ConditionalAttribute中引用)。但我不知道有任何关于启用了哪些优化的全面文档-事实上,我怀疑微软会想在不通知的情况下免费增强他们的优化器

    如果您使用任何ASP.NET Ajax控件,一个主要的性能方面是:在运行时从JavaScript库中删除调试信息我在复杂的页面上看到了重大的性能改进。基于此设置,其他基于web的资源可以缓存,也可以不缓存

    另外,请记住,web应用程序中的调试/发布由
    web.config
    文件决定,而不是由Visual Studio中的设置决定

    <system.web>
        <compilation debug="true">
    
    
    
    更多信息:


    没有一份文件列出这些差异。除了已经列出的一些差异外,在调试模式下编译将关闭运行时执行的大多数JIT编译器优化,并将更完整的调试信息发送到符号数据库文件(.pdb)


    另一个很大的区别是GC行为有些不同,JIT编译器将根据需要插入对GC.KeepAlive()的调用,以支持调试会话。

    当我将可执行文件分发到另一台计算机时,收到一条错误消息,指示系统缺少MSVCP110D.dll

    堆栈溢出问题中说明了此问题的解决方案

    在XXXXD.dll中,D表示dll文件是dll文件的调试版本。但是MS VisualC++可重分发包只包含DLL文件的发布版本。

    <强>这意味着如果你需要发布一个你开发的程序需要在发布模式下构建它。你还需要在目标机上安装MS VisualC++ +可重新分发(正确版本)。


    因此,我认为这是调试模式和发布模式之间的一个关键区别。

    您还可以管理希望仅在调试中或仅在带有预处理器标记的发布中运行的部分代码:

     #if DEBUG
        // Some code running only in debug
     #endif
    


    调试和发布只是为不同的解决方案配置添加标签。如果需要,您可以添加其他人。如果您希望从configuration manager添加更多配置——

    主要差异-

  • 在调试DLL中,添加了几个额外的指令,使您能够在Visual Studio中的每个源代码行上设置断点。此外,代码也不会进行优化,以使您能够调试代码。 在发布版本中,这些额外说明将被删除

  • PDB文件仅在调试模式下创建,而不是在发布模式下创建

  • 在发布模式下,代码由内置在JIT编译器中的优化器进行优化。它进行了以下优化:

    •方法内联-方法调用被注入方法代码所取代

    •CPU寄存器分配-本地变量和方法参数可以存储在CPU寄存器中,而不会(或不太频繁)存储回堆栈帧

    •阵列索引检查消除-使用阵列时的一项重要优化(所有.NET集合类都在内部使用阵列)。当JIT编译器能够验证循环从不将数组索引超出边界时,它将消除索引检查

    •循环展开-通过重复循环体中的代码,可消除带有小实体的短循环(最多4个)

    •死代码消除-像if(false){/../}这样的语句被完全消除

    •代码提升-不受环路影响的环路内的代码可以移出环路

    •通用子表达式消除。x=y+4;z=y+4;变成z=x


  • 这个答案是正确的,但很肤浅,我想知道更多关于代码行为的细节,比如使用代码优化和使用调试常量。代码的行为方式有很多不同,您可以查看我前面的问题作为示例抱歉,如果这没有帮助的话。我建议你修改你的问题以便得到更好的答案。我认为调试常量的行为相当清楚(可以在#if预处理器指令或ConditionalAttribute中引用)(contd…)。。。(继续超过300c极限)。但我不知道有什么合作伙伴