科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道应用软件ASP.NET 2.0中的代码隐藏和编译(2)

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文描述这个新的代码隐藏模型、它的基本原理,以及 Web 开发人员将如何使用它。并介绍该模型的一些潜在的副作用以及如何在设计中解决它们。请注意,ASP.NET 2.0 运行时完全支持 1.x 模型,因此针对 1.x 编写的应用程序可以在无需修改的情况下直接运行。

作者:MSDN 来源:MSDN 2007年9月2日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
编译

此时,您可能想知道,为什么 ASP.NET 小组非要使用这个新代码隐藏模型来使用继承。ASP.NET 除了将来自 .aspx 文件的方法呈现为部分类(然后这些类与简化的代码隐藏类合并)之外,还可以轻松生成所有控件变量声明。这就是 Windows 窗体在 .NET Framework 2.0 中的工作方式。设计器生成的所有代码被放置在同辈部分类(然后该类与您的应用程序逻辑合并)中,事件处理程序被放置在窗体驱动的单个类中,从而在无需借助于继承的情况下,在计算机生成的代码和开发人员代码之间创建一个完全的分离。

ASP.NET 2.0 中代码隐藏的原始实现也执行此操作 — 代码隐藏类只是一个与分析的 .aspx 文件类定义合并的部分类。它简单有效,但遗憾的是它不够灵活。该模型的问题在于,预编译的二进制程序集中的代码隐藏文件不再能够与完整的 .aspx 文件一起部署,因为它们现在必须同时编译(使用部分类的一个限制是,一个类的所有部分必须在单个编译中合并,而且类定义无法跨越程序集)。对于许多开发人员而言,该限制是无法接受的,因为他们已经习惯于将二进制代码隐藏程序集与完整的 .aspx 文件一起部署,后者随后会进行适当的更新而不必重新编译。实际上,这就是默认情况下 Visual Studio .NET 2003 中使用的模型,而且在实践中非常流行。

由于重新引入了继承模型并将部分类移到基类中,.aspx 文件现在可以从代码隐藏类中进行独立部署和编译。为此,您需要某种方式在编译或部署过程中生成同辈的部分类,后者包含控件变量声明,因为在过去这一直是针对请求进行的。走近 ASP.NET 编译器。

在 ASP.NET 2.0 中,ASP.NET 编译器 (aspnet_compiler.exe) 最初作为完全预编译整个站点的一种方式引入,从而使得只部署二进制程序集成为可能(甚至也对 .aspx 和 .ascx 文件进行预编译)。这是非常吸引人的,因为它消除了发出请求时的任何按需编译,从而消除了目前在一些站点上可以看到的第一个部署后点击。它也使得对已部署站点进行修改更加困难(因为您无法打开 .aspx 文件并更改内容),当部署只想通过标准部署过程更改的应用程序时,这是很吸引人的。ASP.NET 2.0 的发布版本提供的编译器支持仅支持二进制的部署模型,但是它也进行了增强以支持可更新的部署模型,其中站点中的所有源代码预编译为二进制程序集,但是所有 .aspx 和 .ascx 文件都基本保持完整,以便可以在服务器上进行更改(针对 .aspx 和 .ascx 文件的更改,涉及移除的 CodeFile 属性以及进行修改以包括程序集名的 Inherits 属性)。由于在代码隐藏模型中重新引入了继承,因此该模型是可能的。这样,包含控件声明的同辈部分类可以独立于实际的 .aspx 文件类定义生成和编译。

图 4 使用 aspnet_compiler.exe 进行二进制部署

图 4 显示使用二进制部署选项对 aspnet_compiler.exe 实用工具的调用,以及针对部署目录的结果输出。请注意,该部署目录中的 .aspx 文件只是没有内容的标记文件。它们之所以位于那里,是为了确保 IIS 应用程序中 .aspx 扩展的“Check that file exists”选项进行设置后,带有终结点名称的文件可用。PrecompiledApp.config 文件用于跟踪应用程序的部署方式,以及 ASP.NET 是否需要在请求时编译任何文件。要生成“可更新的”站点,需要将一个 -u 添加到命令行,得到的 .aspx 文件将包含它们的原始内容(而不是空的标记文件)。请注意,该功能也可以通过 Visual Studio 2005 的 Build | Publish Web Site 菜单项以图形方式访问,如图 5 所示。该命令行工具和 Visual Studio 都依赖于 System.Web.Compilation 命名空间的 ClientBuildManager 类提供该功能。

图 5 Visual Studio 2005 中的 Build | Publish Web Site 工具



使用手边的 aspnet_compiler 实用工具,您无需担心应用程序的大体部署方式就可使其运行,因为任何站点都能以下面三种方式之一进行部署 — 全源、全二进制或可更新(二进制文件中的源代码和源代码中的 .aspx 文件)— 无需对开发中使用的页面属性或代码文件进行任何更改。这在以前的 ASP.NET 版本中是不可能的,因为您必须在开发时决定是否使用 src 属性来引用代码隐藏文件,或者预编译它们并将程序集部署到 /bin 目录。完整的二进制部署甚至不是一个选项。

程序集生成

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

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

 
Deployment Mode
  All Source All Binary Updatable (mixed)
What compiles into a unique assembly App_Code directory App_Code directory

global.asax

.ascx and associated codebehind file (separate assembly for each user control)

.master and associated codebehind file (separate assembly for each master page)

All .aspx files and their code-behind files in a given directory (separate assembly per directory)
App_Code directory

global.asax

.ascx and .master files and their associated codebehind files

All .aspx files and their code-behind files in a given directory (separate assembly per directory)
App_Code directory (D)

global.asax (R)

.ascx and .master files (R)

codebehind files for .ascx and .master files (D)

All .aspx files in a given directory (separate assembly per directory) (R)

All codebehind files associated with .aspx files in a given directory (separate assembly per directory) (D)
When it's compiled Request time Deployment time (R) = Compiled at request time

(D) = Compiled at deployment time
    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章