鸡肋烹制出的美味——真正可调试的ASP.NET AJAX

本文介绍如何将 ASP.NET AJAX 的源代码转换为 C# 工程,以便于进行有效的调试。作者详细解释了整个过程,包括下载源码、修改配置文件等步骤,并列举了一些使用过程中需要注意的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


======================================================
注:本文源代码点此下载
======================================================

鸡肋般的源码

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^)/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值