2006年4月21日星期五

ASP.NET 2.0 的编译模型并非完全像 MS 说的那样

上次说到了ASP.NET 2.0解决了Code-Behind需要同步声明控件的问题,说MS的图例解释2.0中aspx和cs的内容不再是继承的关系,而是partial的关系,是合并编译。然后我说了,如果是partial关系,那么处理过程就很复杂。因为partial不能增量编译,也就不能跨语言编译,必须把aspx部分内容完全翻译为cs或者其他对应Code-Behind语言,然后才能够多partial一起编译。但实际上当然不是这样做,现实中aspx既是partial,又像1.x那样要做为继承类再编译一次。

发现这个问题,是由于我在cs声明了一个private的函数,想在aspx中的数据绑定语句中使用,结果调用时竟然告诉我找不到该函数,然后我把private改成protected就可以了。如果aspx和cs真的完全是partial关系,那么private函数是能够找到的,private找不到说明aspx中数据绑定语句和cs肯定不是在同一个类中,也就是不是partial关系,而是好像1.x那样的继承关系。实际上,我说的aspx完全翻译为Code-Behind所用语言应该是做不到的,最多把aspx中的所有服务器控件声明翻译。因为都是声明,可能如果一个partial里面有的只是声明,那编译器内部就支持增量编译,因为声明在编译结果里就是一个比较独立的部分。然后aspx中的其他逻辑都是好像1.x那样,再继承编译好的Code-Behind代码,把UI代码加上去。

没有评论:

发表评论