ASP.NET 2.0 中的代码隐藏和编译

来源:百度文库 编辑:神马文学网 时间:2024/10/01 08:48:38

既然编译为程序集可以在三种情况下发生(由开发人员显式进行,使用 aspnet_compiler.exe,或者在请求处理中进行),因此了解文件到程序集的映射变得更为重要。实际上,根据编写页面的方式,您实际上可以得到一个应用程序,在作为全源或全二进制部署时,该应用程序可以正常工作,但在使用可更新的切换进行部署时,却编译失败。

模型 ASP.NET 通常使用 App_Code 目录内容的单独程序集以及 global.asax 文件(如果存在),然后将每个目录中的所有 .aspx 页编译为单独的程序集。(如果同一目录中的页面是以不同语言制作的,或者它们通过 @ Reference 指令彼此依赖,则它们也可以形成单独的程序集。)用户控件和母版页通常也独立于 .aspx 页进行编译。例如,如果要在一个项目中包含 Visual Basic® 和 C# 源代码,也可以配置 App_Code 目录来创建多个程序集。在程序集创建的细节中有一些细微差别,这取决于您所选的部署模式。图 6 描述特定 Web 站点的组件,该 Web 站点基于您要使用的部署模式编译为单独的程序集。(请注意,我要忽略资源、主题和浏览器目录,因为它们不包含代码,虽然它们也编译为单独的程序集。正如前面提到的,目标程序集也因语言的不同和引用依赖项而异。)

程序集生成的另一个技巧是,使用 aspnet_compiler 的 -fixednames 选项请求将每个 .aspx 文件编译为单独的程序集,该程序集的名称跨编译器的不同调用保持一致。如果您想更新单个页面而不修改部署站点上的其他程序集,这是很有用的。它也可以为任何大型站点生成大量程序集,因此您一定要在使用该选项之前测试您的部署。

如果您觉得这比较复杂,我可以告诉您它的优点,即您无需花费大量时间考虑将哪些文件映射为单独的程序集。.aspx 文件一直在最后进行编译,并一直包括对生成的所有其他程序集的引用,因此,无论您选择哪种部署模型,它通常都会正常工作。

在部署中,可能实际影响您在页面中制作代码的方式的一个重要区别是,当使用可更新部署时编译中的分离。当部署可更新站点时,代码隐藏文件在部署之前编译为单独的程序集。从 .aspx 文件生成的类不进行编译,除非作出对目录中文件的实际请求。这与二进制部署(其中所有文件在部署之前编译)以及源部署(其中所有文件在请求时编译)形成了鲜明对比。以下这一简单的示例解释这是如何引出问题的,请考虑图 7 中带有嵌入属性的用户控件(.ascx 文件),以及一个使用该控件并从其代码隐藏类设置该属性的相关页面。

图 7 中的页面将以源或二进制部署模式编译并运行,但是当作为可更新站点部署时将无法编译,原因是该用户控件 Color 属性的定义在部署时不可用(该限制也存在于 1.x 模型中)。要避免此类问题发生,通常您可以将所有代码放在代码隐藏文件中,或者干脆不使用代码隐藏文件,将代码直接放在 .aspx 和 .ascx 文件中。

有关文件到程序集映射的另一个注意事项是,使用内部关键字防止外部程序集访问类中的方法,这可能只在某些部署方案中奏效而在其他方案中却不然,这是因为存在不同的程序集映射选项。除非您提前计划要使用哪个部署选项,否则最好避免在页面中使用内部方法并继续使用类型范围的保护关键字:公共、受保护和私有。

返回页首

小结


对于 ASP.NET 开发人员而言,ASP.NET 2.0 中的新代码隐藏模型既熟悉又陌生。之所以说熟悉是因为,它仍然使用继承将代码隐藏类与其 .aspx 生成的类定义相关联,而之所以说陌生是因为,诸如部分类这样的元素和控件成员变量声明的隐式生成都是基本的转换。实际上,您可能不会注意到用法上的许多差别,但是无论您何时进行非一般的操作(例如,创建一个通用基 Page 类,或者将代码隐藏与内联代码模型混合),了解本文描述的类关系和程序集映射都是很重要的。