ASP.NET 2.0的编译行为

在从ASP.NET1.12.0迁移的时候在如何生成debugrelease的构建(builds)方面做了调整.

1.1

1.1的时候(对应的IDE是VS2003),在生成(build)菜单下面有一个配置管理器(Configuration Manager)的菜单项.点击这个菜单项会弹出一个对话框,你从中可以选择一些可用的构建配置.VS2003默认情况下提供了Debug和Release这两种配置.在配置管理器(Configuration Manager)中选择的配置信息可以告诉VisualStudio如何编译code-behind文件.成功编译后就会在bin目录中生成一个.dll文件(:选择Release模式不会生成pdb文件),如果配置的时候需要生成调试符号(Debugging Symbols)的话,还会同时在bin目录中生成一个包含调试符号的后缀名为pdb的文件(:选择Debug模式生成pdb文件).

稍后,当这个应用程序接收到一个web请求就开始执行时,ASP.NET运行时(runtime)就会为应用程序的web窗体 (web forms)和用户控件(user control)生成代码,并且编译生成的代码(这里的代码应该指的是MSIL代码).运行时的编译(JIT编译)将会根据web.configcompilation节中的调试设置(debug setting)来决定是否编译优化过的代码,是否生成调试信息.ASP.NET将把生成的结果放到临时ASP.NET文件目录中(Temporary ASP.NET file).VS2003中只有选择Release模式并且同时web.config中把debug设置为false才能产生真正的不带调试符号的产品.

2.0

在2.0中有一个非常重要的概念就是:VS2005并不知道编译一个web应用程序的任何信息(knows nothing).在1.1中visual studio构建code-behind文件,asp.net则负责构建web窗体.而在2.0中vs2005把所有的编译工作都交给了ASP.NET平台做.

有了这些概念后,这里有两种场景需要探讨:构建一个不带Web站点部署工程 web应用程序和构建一个带Web站点部署工程web应用程序.我们先看第一种,当你让Visual Studio构建一个web工程的时候,看起来好像什么都没有发生.你并没有发现在你的工程中创建了一个bin目录,里面有编译好的dll.这是因为现在是ASP.NET而不是Visual Studio来构建的.ASP.NET构建所有的的一切,包括.cs.vb文件.ASP.NET把结果程序集放到Temporary ASP.NET files目录中,你可以自己打开看看.由于是ASP.NET负责所有的编译工作,所以web.config中间中complilation节的debug设置控制着当前应该是debug模式还是release模式.debug设置为true的时候,你会发现生成程序集的同时会生成一个保存调试信息的pdb文件.这种新的编译模式使得对于一个web站点项目来说配置管理器已经过时了.vs2005的配置管理器只能看到debug一个选项.不要着急,这不会有任何问题.实际上web.config中的debug设置控制着这些(和配置管理器没有什么关系).当你打算部署的时候,你可以发布这个网站,构建->发布(Build->Publicsh)将预编译整个web应用程序并且把结果保存在你选择的目录里.你也可以把它发布到IIS或者FTP.当你选择发布(publish)命令的时候,你会看到一个对话框可以选择目标位置,强命名选项等等.这些选项和命令行工具aspnet_compiler中用到的一些开关是一一对应的.aspnet_compiler工具还提供了是否产生调试符号的开关,但是这个选项在发布(publish)对话框中是不可用的.发布总是预编译一个不包含调试信息的release版本.

注意:发布(publish)命令并不会改变web.config中的debug设置.发布命令总是编译一个release版本.然后,如果你想预编译一个可更新(updateable)站点,以后可以在适当的时候更新站点(这将会导致动态编译),这样的动态编译将会产生debug代码和pdb文件.

新的Web站点部署工程稍微改变了上面所说的场景.WSD在Visual Studio 2005的配置管理器(configuration manager)中添加了ReleaseDebug的配置.但是这并不意味着Visual Studio知道如何编译web站点.而是,Visual Studio知道如何使用WSD提供的MSBuild文件构建Debug或者Release版本.你现在可以在配置管理器中选择Debug或者Release.这种请求最终还是要交给aspnet_complier执行的,发布命令也是这样的.

和发布命令不同的是,一个WSDRelease构建会改变web.config中的debug设置为false.而且WSD会默认把release构建放到release目录中,debug构建放到debug目录中,这对于使用.net开发非web form程序的人来说是很熟悉的.

装上Visual Studio 2005 Service Pack 1后就可以创建web应用(web application),VS2005web应用的编译行为和web站点(web site)又有区别.对于一个web应用工程来说,配置管理器中debugrelease两种模式都是可用的,但是不管选择哪种模式,生成的程序集中都会包含一个pdb文件,即使你在web.config中的compilation节的debug设置为false也没有任何作用.选择发布(publish)一个web应用也会带着包含调试符号的pdb文件.那么是不是没有办法发布不带pdb文件的程序集?当然会有办法.web应用的工程文件属性à生成à高级,你可以看到如下一个对话框:


其中选择none的时候会产生不带pdb文件的程序集.

 

总结:你可以使用web.config中的debug节的设置控制你要生成Debug版本还是Release版本 (前面这句话对web application不适用).但是你使用发布(publish)命令预编译web站点或者使用web站点部署工具情况除外.WSD会让你选择是生成Debug还是Release版本,然后预编译web站点,并且对应修改web.configdebug设置.

大部分内容翻译自K. Scott Allen博客,自己加了一些web application相关的编译行为.

posted on 2007-04-29 16:55 zhanqiangz(闲云野鹤) 阅读(3845) 评论(8)  编辑 收藏 所属分类: 翻译ASP.NET2.0

评论

#1楼  2007-04-29 17:18 程式劣人 [未注册用户]

在release模式下也应该生成PDB文件,这样有利于排错,当生产环境站点遇到性能或者疑难问题时,PDB文件就是非常重要的调试资源   回复  引用    

#2楼  2007-04-30 10:58 马可香蕉      

看了半天没懂。。。。唉~~~   回复  引用  查看    

#3楼  2007-04-30 11:22 A.Z [未注册用户]

asp.net的编译模型变化的很快,因为它实现了web form里面自动化的那部分来静/动态构建.net的传统类库模型。所以sp1的发布模型完善也是必然的。   回复  引用    

#4楼  2007-04-30 13:49 Artech      

先收藏, 待会看!   回复  引用  查看    

#5楼  2007-05-25 14:39 qw [未注册用户]

讲这么多,不知所云....

你就直接讲compication debug设置成false还是true不就可以了?   回复  引用    

#6楼 [楼主] 2007-05-25 15:06 zhanqiangz(闲云野鹤)      

@qw
可以理解你说的话,你根本就没有看懂.
  回复  引用  查看    

#7楼  2007-09-24 09:24 MikeLee [未注册用户]

谢谢楼主的文章,看过后让我大概了解如何产生Debug和Release版本的方法   回复  引用    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-04-29 17:30 编辑过
 
另存  打印
 


<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345

导航

统计

公告

如转载本博客的相关资料敬请注明出处.谢谢合作!

与我联系

常用链接

留言簿(6)

我参与的团队

我的标签

随笔分类(51)

随笔档案(49)

文章分类(7)

文章档案(5)

收藏夹(3)

.NET

BizTalk

Design

JavaScript

My Blogs

Power Tools

Process Control

Search Engine

SQL Server

XML

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜