[你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题

问题的提出

晚上翻着群里的聊天,发现一个有趣的问题:如何通过编码方式来判断一个dll或者exe为debug build还是release build?由于没有太多的讨论,所以我只好自己找点儿办法,试图解决这个问题,为夜生活带点刺激。于是,便有了本文的探索和分析。

当然,为了充分的调动起大家的主意,省去不必要的google操作,我觉得有必要对Debug和Release两种模式的异同进行一点提纲挈领式的分析,从而为接下来的解决方案打好基础。

Debug & Release

我们应用Visual Studio对代码文件进行F5操作(Build)时,实际是发生了一系列语法检查、词法检查和编译过程,通常情况下我们有两种Build模式,这就是常说的Debug Build和Release Build。望文知意,Debug Build模式通常应用于开发时,便于调试反馈;而Release Build则应用于部署时,这是因为Release模式下,编译器做了很多的优化操作(代码冗余、循环优化等),省去了对调试信息的记录。因此,两种 Build模式是各不相同的,我们对其二者进行一点总结如下:

Debug用于开发时,Release用于部署时。

Debug模式下,将产生pdb文件,用于保存状态信息和调试信息;Release模式下,不产生调试信息,也没有pdb文件。

Debug模式下,System.Diagnostics.Debug.Write(或WriteLine)可以向跟踪窗口(Output)输出跟踪信息;而Release模式下,System.Diagnostics.Debug.WriteLine将被忽略。不过,可以考虑 System.Diagnostics.Trace.Write,其人缘较好,对Debug和Release左右通吃,都可输出调试信息。

Debug模式下,#define DEBUG将作为默认预定义常量,参与编译过程;而在Release模式下,该预编译将被省略。例如如果执行:

#if DEBUG

   Console.WriteLine("Hi");

#endif

在Debug模式下,Console.WriteLine(“Hi”)将参与编译,而Release模式下,会忽略该语句的执行。不过,如果你手动添加

#define DEBUG

在两种模式下,都会执行Console.WriteLine(“Hi”)的编译。究其原因,是Visual Studio在默认情况下预定义了#define DEBUG,我们可以通过开关来设置:

关于预编译指令可详查《你必须知道的.NET》的相关章节。

时间: 2024-11-02 18:05:09

[你必须知道的.NET]第三十五回,判断dll是debug还是release,这是个问题的相关文章

[你必须知道的.NET]第三十四回,object成员,不见了!

在.NET世界了,object是公认的造物主,其麾下的7大成员,个顶个的横行在任何系统的任何代码角落. public class Object { public Object(); public virtual bool Equals(object obj); public static bool Equals(object objA, object objB); public virtual int GetHashCode(); public Type GetType(); protected

[你必须知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二

本系列文章导航 [你必须知道的.NET] 开篇有益 [你必须知道的.NET] 第一回:恩怨情仇:is和as [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类 [你必须知道的.NET] 第三回:历史纠葛:特性和属性 [你必须知道的.NET] 第四回:后来居上:class和struct [你必须知道的.NET] 第五回:深入浅出关键字---把new说透 [你必须知道的.NET] 第六回:深入浅出关键字---base和this [你必须知道的.NET] 第七回:品味类型---从通用类型系统开

艾伟:[你必须知道的.NET]第三十二回,深入.NET 4.0之,Tuple一二

本系列文章导航 [你必须知道的.NET] 开篇有益 [你必须知道的.NET] 第一回:恩怨情仇:is和as [你必须知道的.NET] 第二回:对抽象编程:接口和抽象类 [你必须知道的.NET] 第三回:历史纠葛:特性和属性 [你必须知道的.NET] 第四回:后来居上:class和struct [你必须知道的.NET] 第五回:深入浅出关键字---把new说透 [你必须知道的.NET] 第六回:深入浅出关键字---base和this [你必须知道的.NET] 第七回:品味类型---从通用类型系统开

[你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二

Tuple,是函数式编程的概念之一,早见于Elang.F#等动态语言.不过,我第一次听说Tuple还早在2005年园子的Ninputer大牛提出在.NET 2.0实现Tuple的基本想法,我们可以通过以下地址仰慕当时的历史片段: 探讨.NET 2.0中Tuple的实现方法 由此可见,Tuple不是.NET 4.0的创造发明,但却是C#趋于函数式编程概念的必要补充.那么,我们首先来看看,什么是Tuple? Tuple为何物? 什么是Tuple,在汉语上我们将其翻译为元组.Tuple的概念源于数学概

[你必须知道的.NET]第三十回:.NET十年(下)

引言 语言是程序开发者行走江湖的手上利器,各大门派的高手在论坛.博客为了自家门派争吵不已早是技术世界中的亮丽风景,虽多少为刚刚踏入江湖的新手提供了思考的素材,但也同时迷惑了初出茅庐的前行方向. 本文不欲计较门派的高下,旨在明辨技术的真谛,这就是.NET平台下的开发利器:C#语言,并从其变迁的进程中对于.NET技术发展把玩一番. 在下篇,我们将从历史走来,对.NET的未来做个展望性的了解,具体而言就是.NET 4.0的新东西. .NET之,未来武器 无论如何,.NET 4.0已经在叩开新年的大门之

[你必须知道的.NET]第三十一回,深入.NET 4.0之,从“新”展望

总体来说,这是一篇介绍性的文章,不会涉及过多技术细节和研究过程.但是,作为拉开序幕的第一页,本文以提纲挈领的方式展开对.NET 4.0的初次体验.从What's new的角度,开始我对.NET 4.0新特性的探索之旅.既然是介绍,那么首先给出导航式的链接是必要而必须的,因为一篇小小的篇幅却是难以交代全面What's new in details,所以看官尽情各取所需吧: Visual Studio 2010 in MSDN What's New in Visual Studio 2010 Wha

[你必须知道的.NET] 第三回:历史纠葛:特性和属性

1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间走进一个发现attribute登堂入室的入口.因为.NET Framework中使用了大量的定制特性来完成代码约定,[Serializable].[Flags].[DllImport].[AttributeUsage]这些的构造,相信我们都见过吧,那么你是否了解其背后的技术. 提起特性,由于高级语言发展的历史原因,不免让人想起另一个耳熟能详的名字:属性.特性和属性,往往给初学者或者从C++转移到C#的人混淆的概

[你必须知道的.NET]第三十三回,深入.NET 4.0之,Lazy<T>点滴

对象的创建方式,始终代表了软件工业的生产力方向,代表了先进软件技术发展的方向,也代表了广大程序开发者的集体智慧.以new的方式创建,通过工厂方法,利用IoC容器,都以不同的方式实现了活生生实例成员的创生.而本文所关注的Lazy<T>也是干这事儿的.不过,简单说来,Lazy<T>要实现的就是按"需"创建,而不是按时创建. 我们往往有这样的情景,一个关联对象的创建需要较大的开销,为了避免在每次运行时创建这种家伙,有一种聪明的办法叫做实现"懒对象"

你必须知道的.NET

[你必须知道的.NET]第三十五回,判断dll是debug还是release,这 [你必须知道的.NET]第三十四回,object成员,不见了! [你必须知道的.NET]第三十一回,深入.NET 4.0之,从"新"展望 [你必须知道的.NET]第三十三回,深入.NET 4.0之,Lazy<T> [你必须知道的.NET]第三十二回,,深入.NET 4.0之,Tuple一二 [你必须知道的.NET]第三十回:.NET十年(下) [你必须知道的.NET]第二十九回:.NET十年(