首页 > 代码库 > Visual Studio编译选项简介

Visual Studio编译选项简介

 

一.概念介绍

      一般来讲,能影响VS编译结果的参数有两个:编译优化和目标平台

      编译优化

      首先要明白一个概念,.Net是一个二次编译模型,所以VS编译的结果是IL代码。而默认情况下VS编译出来的IL代码,会包括很多NOP指令(空指令),还包括许多分支指令等。VS会利用这些指令对程序调试操作提供更好的支持。而所谓的编译优化,就是去掉这些额外的指令,让程序集的体积和运行时所占的内存更小一点。

      其它平时更常用的说法叫Debug版与Release版。Debug版就是关闭编译优化的版本,Release版就是打开编译优化的版本。

      目标平台

      现代操作系统分为32位与64位。32位操作系统可以运行32位程序,64位操作系统可同时运行32位与64位程序。操作系统通过识别程序文件的头来判定程序的类别。如果包括一个PE32头,则是32位程序,如果是PE32+头,则是64位程序。VS的目标平台有3个选项,X86,X64和AnyCpu。如果选择X86,则会在程序集的前面加上一个PE32头,如果选择X64则加上一个PE32+头。而AnyCpu则有点特殊,它将程序集加上一个PE32头,但是CLR会跟据运行环境自动调整JIT编译器编译出的目标机器码。所以如果普通的静态分析工具分析程序集文件会发现它是32位程序,但是运行时却是64位程序。

      通过Visual Studio command prompt下的corflags命令则可以确定程序集的实际类别。如果是X86编译,PE:PE32,32BIT:1,如果是X64编译,PE:PE32+,32BIT:0,如果是AnyCpu编译,PE:PE32,32BIT:0。

二.在解决方案中设置编译选项

      可以在解决方案属性页中对所有项目提供基础设定。

      可以看到,在最上面一行有两个参数分别对应上文所说的概念:配置和平台。这里的配置就是指是Debug模式还是Release模式,选项第一个活动(XXX)表示当前的选择。平台则是表示X86,X64,还是部份X86部分X64混合着用,同样选项里第一个活动(XXX)表示当前的选择。右面的主面板里可以对每个项目进行单独与详细的设置。

      这里有几个需要注意的地方,我是经过多次探索才得出结论的。

      1.可以看到,在界面上最上面一行有配置与平台选项,在右面主面板里每个项目又有自己的配置与平台选项。但它们所表达的意思是不同的。真正对项目编译起作用的是主面板里的设置,而最上面的设置可以把它想像成主面板相对应设置集的一种编译策略的名字。就如上图所示,配置里选的是Debug,但主面板里有配置成Release模式的项目。举个例子,你可以建一个名叫M的配置,M显示在最上面的配置下拉框里,其中前三个项目是Debug模式,后两个是Release模式,然后再建一个名叫N的平台,N将显示在最上面的平台下拉框里,其中第一个是X86,后面四个是X64模式。

      可以通过配置管理器按钮来维护配置集与平台集。

      2.直接通过最上面的上拉框是无法改变项目设置的。比如将上面的配置下拉框由活动(Debug)改成Release,当然你可以看到主面板里各个项目的设置确实都已改了。但是如果你点确定,然后再进入本窗口时,却发现最上面的选择仍然是先前的活动(Debug)。这里可以选让你误以为直接可以更改的原因,我猜是方便给你查看的。

      3.更改设定会影响生成dll与exe的目录。

平台

模式

目录

AnyCpu,X86

Debug

bin\Debug

Release

bin\Release

X64

Debug

bin\X64\Debug

Release

bin\X64\Release

 

三.在项目中设置编译选项

      项目属性页里也可以对具体项目做配置与平台的设置。

      可以看到,在最上面一行也有配置与平台的下拉框。如同上面所述一样,这里也是只能看,不能改。

      勾选优化代码等同于选择Release模式,也可在目录平台下拉框更改平台选项。

      在页面最下面有一个高级按钮,点开后会弹出如下框

      这里最重要的就是调试信息了,点开下拉框后显示如下:

      这里只有选中full或pdb-only时才会生成pdb文件。pdb全称Program Database,里面保存了IL代码与源代码的对应关系。只有在编译时生成了此文件,源代码才可调试。

四.要注意的问题

      由上文可知,程序集的生成目录是被解决方案属性页里的设置影响的,但实际的编译模式却可以被项目属性页更改。这会带来目录名与实际程序集类型不一致的问题。比如你在解决方案里设定为X64平台,但是在项目属性页里却将其目标平台改为X86,结果就是在X64的目录里生成了X86的程序集。这一点一定要注意。

 

http://www.cnblogs.com/ljzforever/archive/2012/11/02/2751888.html