asp.net应用程序默认情况下,在初次访问页面的时候,会在c盘某目录(太长不直接写了)下生成把被请求的页面所在的目录的所有需要编译的文件进行编译,并生成一个Assembly。假如现在我建立了一个名为"webApp"的应用程序,那么当我点击生成的时候会在bin文件夹下出现一个webApp.dll,这个webAPP.dll与运行时在c盘下生成的Assembly有什么样的关系,希望能有前辈解答一下,如果我前面说得哪里不对,也希望能点出来

解决方案 »

  1.   

    你说的那个某目录下的某文件,是根据aspx动态编译的。而你的webapp.dll编译的是你的程序中的App_Code和.cs中的页面类。
      

  2.   

    这个dll是你的编译器生成的。假设你是以“发布”的方式来部署,那么实际上目标网站没有源代码(甚至aspx、ascx、master page、asax等等里边也必须没有任何控件布局设计源代码)。因此在你所谓的“太长的目录”下见到的dll(其实会有很多dll文件),并不是“编译生成的”,而是copy过去的。也就是上述这个dll复制到另外一个template的目录下的。为什么要先copy到临时目录,而不直接执行bin下的dll呢?因为asp.net网站需要随时支持被客户端改变。例如你通过ftp客户端上传一堆新的文件,包括bin下的dll文件,这个时候并不会出现“文件已经被另外一个进程占用”的错误。因为asp.net进程运行时,根本不是调用bin下的dll文件,而是调用所复制的临时目录下的备份dll文件。这样,当asp.net进程处理完毕当前的所有会话(新的会话会被阻塞延迟),它就会立刻重启asp.net进程,从而再次复制你刚刚上传的一堆新的dll文件,新的进程于是就加载这些新的dll文件。简单说,这保证了在asp.net进程正在处理数以百计的会话的同时,你可以同时更新网站dll。
      

  3.   

    web服务器系统上这种“稳定性”要求,也会让许多只编写桌面小程序的人感到不习惯。例如asp.net进程经常重启,例如你更新任何一个bin文件,或者删除或者添加任何一个子文件夹(除非是app_data文件夹下的),等等,都会让asp.net进程自动重启。此时你存在asp.net进程中的所有内存中的数据就“丢失”了,例如Session集合、static变量等等,值就“丢失”了。因为asp.net进程瞬间就重启了,然后用新的进程处理下一个消息。这种静默的、无须人工干预的快速(通常在1、2、3秒钟内即可重启完毕)自动重启,可以保证即使是一个比较烂的服务器上的网站程序也比较稳定地长时间服务于许多用户。