Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 461|回复: 0

在ASP.NET Web Application中使用App_Code文件夹引发的异常

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-12 09:33:28 | 显示全部楼层 |阅读模式

    在Visual Studio中,新建一个网站有两种方式:ASP.NET Web Site与ASP.NET Web Application。与Web Site相比,Web Application有很多优势。网上已经有很多文章来讲述它们的区别了,Visual Studio的官方博客有一篇文章讲述了它们各自的优劣点。这里以Visual Studio 2010为例,新建一个Web Site的操作如下:

    2012-05-19_174511

    很简单。网站项目中除了该有的ASPX文件外,应该还有很多辅助的的CS文件,比如数据库操作的,字符串操作等等所谓的辅助类。很多时候,我们可以新建一个Class Library来包含这些文件,以达到代码复用的目的。但有些时候,很多类文件只适用于当前的网站,或者我们不想搞得那么复杂,想直接在Web Site中添加类文件。这时Visual Studio会弹出一个对话框来告诉你应该把类文件放在一个称为App_Code的文件夹中:

    2012-05-19_175758

    可以看到,这个App_Code的图标是区别与一般文件夹的:

    2012-05-19_180113

    与此类似的还有一些特殊的文件夹,我们可以在Web Site的名称上点右键,选择 “Add ASP.NET Folder”:

    2012-05-19_214313

    关于这些特殊文件夹的作用,可以查阅MSDN上的这篇文章:ASP.NET Web Project Folder Structure

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

    好了,当我们新建ASP.NET Web Application项目的时候,我们也想像这样添加一些和项目相关的类文件,而不是去新建一个Class Library。这时你会发现,Visual Studio里已经没有App_Code这个特殊的文件夹了:

    2012-05-19_215308

    于是乎,你去Google或Baidu一下,那些文章就会告诉你让你手动添加一个名为"App_Code"的文件夹。于是你也照做了,也发现Visual Studio也确实识别了该文件夹,因为它的图标和在Web Site中的一样了:

    2012-05-19_220012

    这时候,你在App_Code中添加一些.cs文件,结果发现在Code-behind中却无法引用它们了。你又去Google了一下,结果告诉你让你改变.cs文件的Build Action,将它从默认的Content改成Compile:

    2012-05-19_220610

    好了,终于可以引用App_Code中的类文件了,项目编译也能通过,貌似一切正常。估计此时你还会埋怨微软为什么要把App_Code文件夹给去掉了。

    结果你一运行,问题就来了:

    2012-05-19_221147

    以上截图的这个Web Application是从博客园园友梁逸晨一篇博客里面下载的。他原来提供的是一个Web Site,我在将这个Web Site转换成Web Application的过程中发现了上述的问题。

    回到上面的错误。它提示编译器在调用一个方法的时候发现了两个相同签名方法,告诉你它不知道调用哪个。一般出现这个错误,主要是由于在同一个命名空间中出现了相同签名的方法,但这样的错误在你编译项目的时候就会报错,不会等到你运行的时候才报出来。

    很自然的,我们会联想到这个问题是由于ASP.NET运行时对App_Code文件夹的特殊处理而造成的。因为只有App_Code文件夹中的代码到运行时才会被编译,因此上面那个错误的大标题是"Compilation Error",而所有其他地方有错误的代码在编译时就会报错。

    让我们去Temporary ASP.NET Files这个文件夹来看看究竟。这里存放的是ASP.NET在执行期间所需的一些临时文件。

    2012-05-19_223728

    打开上面这个以App_Code为前缀的cs文件,你会发现它和项目中的App_Code文件夹下的代码文件是一样的。然后我们打开assembly这个文件夹,会发现Web Application项目生成的DLL文件,我们使用Reflector打开看看:

    2012-05-19_224137

    你会发现这个DLL里面也包含了App_Code文件夹里面的代码,因为我们刚才把它下面源文件的Build Action 改成了Compile,这样就造成了重复的类和方法。

    其实解决这个问题的方法很简单,只要你将文件夹的名称改成不是"App_Code"就行了,这样ASP.NET运行时就不会对它有任何的特殊处理了。另外一个解决办法是维持App_Code下的代码文件的Build Action为Content,这样的话生成的DLL中就不会包含它,但这会造成Visual Studio的智能感知不起作用,因为这些文件将不会被识别为代码文件。

    总之,微软在Web Application中去掉这个App_Code这个特殊的文件夹显然是有意为之。而我们程序员也不要自作聪明的为它加上,对网上的一些文章要抱着怀疑的态度来看待,一定要自己动手实践。

    国外的一篇博客上对此也有讨论,请点击下面的链接:
    App_Code folder doesn’t work with Web Application Projects (WAPs)

    相关文章:
    Web Site项目和ASP.NET Web Application中App_Code文件夹的作用

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-18 13:03 , Processed in 0.080611 second(s), 29 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表