asp.net

位置:IT落伍者 >> asp.net >> 浏览文章

ASP.NET 网站中的共享代码文件夹


发布日期:2022年03月01日
 
ASP.NET 网站中的共享代码文件夹
网站中的共享代码文件夹

如果您的 Web 应用程序包括要在多个页之间共享的代码您可以将代码保存在 Web 应用程序根目录下的两个特殊文件夹(Bin 文件夹和 App_Code 文件夹)中的某个文件夹中当您创建这些文件夹并在其中存储特定类型的文件时ASPNET 将使用特殊方式处理这些文件

Bin 文件夹

可以在 Bin 文件夹中存储编译的程序集并且 Web 应用程序任意处的其他代码(如页代码)会自动引用该文件夹典型的示例是您为自定义类编译好的代码您可以将编译后的程序集复制到 Web 应用程序的 Bin 文件夹中这样所有页都可以使用这个类

Bin 文件夹中的程序集无需注册只要 dll 文件存在于 Bin 文件夹中ASPNET 就可以识别它如果您更改了 dll 文件并将它的新版本写入到了 Bin 文件夹中则 ASPNET 会检测到更新并对随后的新页请求使用新版本的 dll 文件

Bin 文件夹的安全性

将编译后的程序集放入 Bin 文件夹中会带来安全风险如果是您自己编写和编译的代码那么您了解代码的功能但是您必须像对待任何可执行代码一样来对待 Bin 文件夹中已编译的代码在完成代码测试并确信已了解代码功能之前要对已编译的代码保持谨慎的态度

请注意以下安全方面的知识这些知识与是否将已编译的代码放入 Bin 文件夹有关

Bin 文件夹中程序集的作用范围为当前应用程序因此它们无法访问当前 Web 应用程序之外的资源或调用当前 Web 应用程序之外的代码

运行时程序集的访问级别由本地计算机上指定的信任级别确定有关更多信息请参见 ASPNET 信任级别和策略文件

如果您使用了诸如 Visual Studio 这样的设计器那么 Bin 文件夹中的代码运行所在的上下文与运行时不同例如代码可能以完全信任状态运行

App_Code 文件夹

可以在 App_Code 文件夹中存储源代码在运行时将会自动对这些代码进行编译Web 应用程序中的其他任何代码都可以访问产生的程序集因此App_Code 文件夹的工作方式与 Bin 文件夹很类似不同之处是您可以在其中存储源代码而非已编译的代码App_Code 文件夹及其在 ASPNET Web 应用程序中的特殊地位使您可以创建自定义类和其他仅源代码文件并在 Web 应用程序中使用它们而不必单独对它们进行编译

App_Code 文件夹可以包含以传统类文件(即带有 vbcs 等扩展名的文件)的形式编写的源代码文件但是它也可以包含并非明确显示出由某一特定编程语言编写的文件例如 wsdl(Web 服务描述语言)文件和 xml 架构 (xsd) 文件ASPNET 可以将这些文件编译成程序集

根据您的需要App_Code 文件夹可以包含任意数量的文件和子文件夹您可以采用任何您认为方便的方式组织源代码ASPNET 仍会将所有代码编译成单个程序集并且 Web 应用程序任意处的其他代码都可以访问该程序集

注意

在 App_Code 文件夹中不允许使用用户控件这包括单文件用户控件以及使用代码隐藏模型的用户控件将用户控件置于 App_Code 目录中会导致不按用户控件代码所要求的顺序对其进行编译因此是不允许的请注意不需要将用户控件置于 App_Code 文件夹中因为处于应用程序中任何位置的页都已经可以使用这些控件

推断 App_Code 文件夹的编程语言

App_Code 文件夹并未显式标记为包含以任何一种编程语言编写的文件相反ASPNET 是根据 App_Code 文件夹所包含的文件来推断应为 App_Code 文件夹调用哪一种编译器如果 App_Code 文件夹包含 vb 文件则 ASPNET 使用 Visual Basic 编译器如果包含 cs 文件则 ASPNET 使用 C# 编译器以此类推

如果 App_Code 文件夹只包含并未明确表明编程语言的文件(如 wsdl 文件)则 ASPNET 将使用 Web 应用程序的默认编译器默认编译器在 Web 应用程序或计算机配置文件的 compilation 元素中确定

在 App_Code 文件夹中使用多种编程语言

因为 App_Code 文件夹中的源代码要编译成单个程序集所以 App_Code 文件夹中的所有文件必须使用相同的编程语言编写例如App_Code 文件夹不能同时包含采用 Visual Basic 和 C# 编写的源代码

但是您可以对 Web 应用程序进行配置使其将 App_Code 文件夹的子文件夹作为独立的可编译单元处理这样每一个文件夹就可以包含以不同编程语言编写的源代码通过在 nfig 文件的 codeSubDirectories 元素中创建一个 compilation 元素然后添加一个对子文件夹的引用即可指定该配置下面的示例阐释如何对名为 VBCode 和 CSCode 的子文件夹进行配置使其编译成不同的程序集

复制代码

<compilation debug=false>

<codeSubDirectories>

<add directoryName=VBCode />

<add directoryName=CSCode />

</codeSubDirectories>

</compilation>对 VBCode 和 CSCode 子文件夹的引用并不需要包括任何有关子文件夹中所包含的编程语言的信息就像对待 App_Code 文件夹本身一样ASPNET 会根据子文件夹中的文件来推断要使用的编译器

App_Code 文件夹的安全性

App_Code 文件夹中的代码存在的安全问题基本上与 Bin 文件夹中的代码存在的安全问题相同 代码都会在运行时编译成程序集比 Bin 文件夹要好一些的是您可以阅读 App_Code 文件夹中文件的源代码但是如果您不能完全理解代码仍然会存在安全风险因此对待 App_Code 文件夹中的源代码的态度必须像对待基于同样的源代码生成的已编译代码一样谨慎

上一篇:ASP.NET 2.0 中的 Windows 身份验证

下一篇:ASP.NET教程:Ref和Out关键字异同