ASP.NET编译模式与pdb文件

来源:互联网 发布:m4a1和ak47 知乎 编辑:程序博客网 时间:2024/05/17 06:14

之前的文章里有提到ASP.NET编译时会自动输出pdb文件,以及ASP.NET调试时看到的是MSIL的代码。现在特意更正一下,这个说法是错误的。

因为前两天我自己在运行时调试的时候,发现当调试进入ASP.NET页面代码的时候,即使选了Disassembly,看到的其实已经是JIT编译之后native的反汇编代码,而不是MSIL或者源代码。而正确引用了pdb文件的dll如enterprise library就能看到源码。

这就涉及到ASP.NET项目的编译模式问题了。目前在VS 2005里有两种ASP.NET项目,一种是Web Site Project,另一种是Web Application Project,后者需要安装相应msi或者VS2005 SP1之后才有。

我们先来看看Web Application Project,他与VS2003的编译模式类似,会先把整个站点的app_code和code behind编译成一个dll,然后与aspx等文件copy到服务器上完成部署。因此他的编译模式与编译dll或者exe一致,rlease版本调试信息的输出可以设置no pdb, pdb-only, full三种方式。

而Web Site Project类型的项目呢,在开发阶段,即使选了Build Project,实际上也不会启动真正的编译工作,而只是VS2005对整个project的代码做了语法检查和依赖性检查等初步的工作。而在开发阶段的调试,则是启动之后,一个页面的被编译动作发生在第一次被请求的时候,如果还没有被编译过,.NET Framework运行时就会调用aspnet_compiler.exe把这个页面以及它引用到的其他类的源码编译之后放在/Windows/Microsoft.NET/Framework/v2.0.50727/Temporary ASP.NET Files之下每个站点自己的编译结果的目录里。这时候的编译方式根据web.config里Compliation节的设置而定,如果debug=true,则是调用aspnet_compile.exe -d,即输出结果里会包含full pdb文件,反之则是no pdb的结果。而下次访问同一个页面时,因为已经编译过了,就会直接跳过编译阶段。

而如果相对Web Site Project使用预编译的方式部署到Production Server,就要选择Publish Web Site的方式,此时会一次性编译所有aspx, ascs, app_cde, code behind等所有程序文件。并根据是否选择Enable Update Web Site的选项,来决定是保留aspx中的源码还是生成彻底的编译结果,在后一种情况下,aspx文件已经只是一个占位的空文件而已。使用Publish Web Site时,在web.config的设置中,无论时是debug=true还是debug=false,VS2005已经hardcode了调用aspnet_compiler进行编译动作时都不带-d参数,即输出的都是no pdb无调试信息的优化的编译结果。这也是为什么在VS2005中查看Web Site Project的编译配置时只有Debug设置的原因,其实这里的Debug已经没有任何意义了。

那么,如果想在Production Server上对asp.net站点作调试能直接看到源码的disassemble,有什么办法呢?

从前面的结论可知,对于Web Application Project,很简单只需对release版本设置pdb-only即可。pdb-only是既对代码编译进行优化,又输出调试信息。full就不好了,不会对代码编译进行优化。

对于Web Site Project,如果使用Precompile的Publish Web Site方式,则是无论如何都无法输出pdb文件,即使手动修改.sln文件中aspnet_complier的设置也无济于事,这确实是一个很头痛的问题。

现在还有另一种方式,就是借助于需要单独安装的Web Deployment Project,他与Pulish Web Site比较类似,实际上也是调用aspnet_complier.exe完成工作,另外他还会调用aspnet_merger完成dll的merge。相对于Publish Web Site方式,它多了一个是否输出pdb的选项,因此这也是一种可行的方法。

但是,由于aspnet_complier的-d参数是full dpb,而没有pdb only的设置,所以从运行时调试的需要出发,最佳的方式还是采用Web Application Project。但他也有自身的弱点,就是开发阶段如果要浏览或者调试之前,必须先build才行,而不如Web Site Project的即写即调那么方便。

原创粉丝点击