App_Code文件夹和Bin文件夹
学习于:http://msdn.microsoft.com/zh-cn/library/t990ks23(v=vs.100).aspx
如果网站项目包括要由多个页共享的代码,可以将这些代码保存在 Web 应用程序根目录下的两个特殊文件夹的某个文件夹中:编译过的代码(.dll 文件)放入 Bin 文件夹,源代码放入 App_Code 文件夹。 当您创建这些文件夹并在其中存储特定类型的文件时,ASP.NET 将使用特殊方式处理这些文件。
1. Bin文件夹
可以在 Bin 文件夹中存储编译的程序集(.dll 文件),并且 Web 应用程序任意处的其他代码(如页代码)会自动引用该文件夹。典型的示例是您为自定义类编译好的代码。您可以将编译后的程序集复制到 Web 应用程序的 Bin 文件夹中,这样所有页都可以使用这个类。
Bin 文件夹中的程序集无需注册。只要 .dll 文件存在于 Bin 文件夹中,ASP.NET 就可以识别它。如果您更改了 .dll 文件,并将它的新版本写入到了 Bin 文件夹中,则 ASP.NET 会检测到更新,并对随后的新页请求使用新版本的 .dll 文件。
注意:Bin 文件夹用于托管代码程序集,而不用于本机代码(非托管代码)程序集。
1.1 Bin文件夹的安全性
将编译后的程序集放入 Bin 文件夹中会带来安全风险。如果是您自己编写和编译的代码,那么您了解代码的功能。但是,您必须像对待任何可执行代码一样来对待 Bin 文件夹中已编译的代码。在完成代码测试并确信已了解代码功能之前,要对已编译的代码保持谨慎的态度。
请注意以下安全方面的知识,这些知识与是否将已编译的代码放入 Bin 文件夹有关:
-
Bin 文件夹中程序集的作用范围为当前应用程序。因此,它们无法访问当前 Web 应用程序之外的资源或调用当前 Web 应用程序之外的代码。
-
运行时,程序集的访问级别由本地计算机上指定的信任级别确定。
-
当在 Visual Studio 中运行项目时,Bin 文件夹中的代码运行所在的上下文与运行时不同。Visual Studio 开发服务器采用登录的标识运行。如果以管理员身份登录,则代码会采用管理员权限运行。但是,当部署网站时,代码通常不会采用管理员权限运行。因此应在部署项目之前使用 IIS 服务器进行测试,以确保不会在生产中出现安全错误。
2. App_Code 文件夹
在网站项目中,可以在 App_Code 文件夹中存储源代码,在运行时将会自动对这些代码进行编译。Web 应用程序中的其他任何代码都可以访问产生的程序集。因此,App_Code 文件夹的工作方式与 Bin 文件夹很类似,不同之处是您可以在其中存储源代码而非已编译的代码。App_Code 文件夹及其在 ASP.NET Web 应用程序中的特殊地位使您可以创建自定义类和其他仅源代码文件,并在 Web 应用程序中使用它们而不必单独对它们进行编译。
App_Code 文件夹可以包含以传统类文件(即带有 .vb、.cs 等扩展名的文件)的形式编写的源代码文件。但是,它也可以包含并非明确显示出由某一特定编程语言编写的文件。例如 .wsdl(Web 服务描述语言)文件和 XML 架构 (.xsd) 文件。ASP.NET 可以将这些文件编译成程序集。
根据您的需要,App_Code 文件夹可以包含任意数量的文件和子文件夹。您可以采用任何您认为方便的方式组织源代码,ASP.NET 仍会将所有代码编译成单个程序集,并且 Web 应用程序任意处的其他代码都可以访问该程序集。
注意:
App_Code 文件夹中不允许存在用户控件(ascx 文件)。这包括单文件用户控件和使用代码隐藏模型的用户控件。将用户控件置于 App_Code 目录中会导致不按用户控件代码所要求的顺序对其进行编译,因此是不允许的。(在任何情况下,都不需要将用户控件置于 App_Code 文件夹中;因为处于应用程序中任何位置的页都已经可以使用这些控件。)
2.1 推断 App_Code 文件夹的编程语言
App_Code 文件夹并未显式标记为包含以任何一种编程语言编写的文件。相反,ASP.NET 是根据 App_Code 文件夹所包含的文件来推断应为 App_Code 文件夹调用哪一种编译器。如果 App_Code 文件夹包含 .vb 文件,则 ASP.NET 使用 Visual Basic 编译器;如果包含 .cs 文件,则 ASP.NET 使用 C# 编译器,以此类推。
如果 App_Code 文件夹只包含并未明确表明编程语言的文件(如 .wsdl 文件),则 ASP.NET 将使用 Web 应用程序的默认编译器,默认编译器在应用程序 Web.config 文件或计算机级别 Web.config 文件的 compilation 元素中确定。编译器是指定的生成提供程序,生成提供程序在 extension 元素中为每个文件扩展名指定。
2.2 在 App_Code 文件夹中使用多种编程语言
因为 App_Code 文件夹中的源代码要编译成单个程序集,所以 App_Code 文件夹中的所有文件必须使用相同的编程语言编写。例如,App_Code 文件夹不能同时包含采用 Visual Basic 和 C# 编写的源代码。
但是,您可以对 Web 应用程序进行配置,使其将 App_Code 文件夹的子文件夹作为独立的可编译单元处理。这样,每一个文件夹就可以包含以不同编程语言编写的源代码。通过在 Web.config 文件的 codeSubDirectories 元素中创建一个 compilation 元素,然后添加一个对子文件夹的引用,即可指定该配置。下面的示例阐释如何对名为 VBCode 和 CSCode 的子文件夹进行配置,使其编译成不同的程序集:
<compilation debug="false"> <codeSubDirectories> <add directoryName="VBCode" /> <add directoryName="CSCode" /> </codeSubDirectories> </compilation>
对 VBCode 和 CSCode 子文件夹的引用并不需要包括任何有关子文件夹中所包含的编程语言的信息。就像对待 App_Code 文件夹本身一样,ASP.NET 会根据子文件夹中的文件来推断要使用的编译器。
2.3 App_Code 文件夹的安全性
App_Code 文件夹中的代码存在的安全问题基本上与 Bin 文件夹中的代码存在的安全问题相同 - 代码都会在运行时编译成程序集。比 Bin 文件夹要好一些的是,您可以阅读 App_Code 文件夹中文件的源代码。但是,如果您不能完全理解代码,仍然会存在安全风险。因此,对待 App_Code 文件夹中的源代码的态度必须像对待基于同样的源代码生成的已编译代码一样谨慎。