======================================================
注:本文源代码点此下载
======================================================
鸡肋般的源码
asp.net ajax的源代码的确发布了,并且提供了pdb文件,也就是说,我们现在可以用它来调试了。
但是它真的够用吗?不知道各位朋友们有没有真的用它跟踪到代码中去,至少我用下来之后非常的不满意。
代码分散在每个文件中,ide的go to definition等功能无法使用。
代码文件不能有丝毫修改,否则pdb里面记录的行号就无法与源代码对应。
在调试时查看对象的属性或成员时,经常会遇到如下的提示:“cannot evaluate expression because the code of the current method is optimized.”,而无法查看属性或成员地值。
其中最后一个问题最为关键,它严重阻碍了调试过程。可是这又有什么办法呢?在编译好的程序集里msil都得到了优化,它已经不是元文件直接编译的结果了。
现在的源代码真是鸡肋。
鸡肋也能烹制美味
谁说鸡肋不能烹制美味?
官方给出了源代码,我们为什么不设法把它恢复成c#工程呢?于是我新建了一个c# class library,把源代码复制到工程中去。然后通过比较编译错误、运行错误以及使用.net reflector查看asp.net ajax程序集,一点点补充丢失的资源和代码,费了九牛二虎之力总算比较完美地恢复了asp.net ajax的程序集。
享用这道美食的方法也非常简单,您只需要做以下几步就可以了:
点击这里下载工程文件和web.config文件。
将压缩包解开,将system.web.extensions工程引入到您的解决方案中去。
为解决方案里必要的工程添加一个刚才新增的system.web.exetensions工程的引用,并删除对gac里system.web.extensions.dll的引用。
修改web.config,将所有的“, version=1.0.61025.0, culture=neutral, publickeytoken=31bf3856ad364e35”去除,您可以对照着压缩包里的web.config文件进行编辑,或者直接使用这个文件。
重新编译。
现在,asp.net ajax已经成为您解决方案中的一个工程了,您可以任意修改它,任意对它进行调试。当调试完毕后,去除对于这个工程的引用,并且重新添加gac里system.web.extensions.dll的引用即可。
享受美味时的注意事项
目前这个工程有些问题可能需要注意一下:
1、调试工程与gac里的system.web.extensions.dll不能同时引用
为了调试时不修改您的任何代码,我保留了调试工程里所有源代码不变,这导致了如果一个工程里同时引用了gac里的system.web.extensions.dll和调试工程,则在编译时会出现命名空间冲突的错误。这似乎是一个无法解决的问题,不过调试工程和gac里的程序集几乎完全一样,您也可以完全使用调试工程进行开发,发布时重新编译一次,并将web.config改回来即可。
2、资源文件名称以及相关代码有轻微改变
由于使用了vs进行编译(使用命令行编译可以解决这个问题,但是就不容易调试使用了),因此资源文件的名称不得不进行了改变,例如microsoftajax.js改成了system.web.microsoftajax.js。相应的,由于源文件中hard-coded了这个文件名,因此我也对它进行了修改。这导致了如果您的程序需要识别这些文件名时,在使用调试工程时也需要修改一下您的代码。例如在我之前的文章《scriptmanager的resolvescriptreference事件的重要作用》中,我会判断程序集是否引用了程序集里名为microsoftajax.js的文件,现在就要判断是否引用了名为system.web.microsoftajax.js。
另外,system.web.ui.webresourceutil类的私有方法systemwebextensionscontainswebresource会用来教验资源文件是否存在,我现在把它改为直接return true,将判断的逻辑短路。这段代码是为了在开发人员恶意访问system.web.extensions.dll程序集里不存在的资源时抛出合理的异常,我们正常使用asp.net ajax时不会受到这个修改的影响。
在几乎所有情况下,这些轻微改变都不会造成使用上的问题。
3、控件的图标没有编译进程序集
控件的图标没有编译进入程序集,这样调试用工程里的控件,如updatepanel在工具栏中不会出现图标。这不会对使用有任何影响,反而可以与gac里的updatepanel进行区分。
4、使用ajax control toolkit时需要重新编译
如果您需要把ajax control toolkit和调试工程同时使用时,您也需要把ajax control toolkit的源文件引入到您的解决方案中,并修改它的引用,使它使用我们调试用的工程。最后需要重新编译,生成新的程序集。
5、调试工程的updatepanel没有设计期支持
要有设计期的支持似乎还需要配合design源码,我会尽快解决这个问题。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/