大家都知道,asp.net必须经过两次编译之后才能正常运行
第一次从源代码编译成中间语言,第二次再把中间语言编译成机器代码,然后才能执行
疑问1:
发布之后的网站已经把cs都编译成了dll,它再执行的时候也需要经过2次编译吗?还是直接可以执行
听有的网友说,发布后的Dll只是做了第一次编译,也就是说把cs代码编译成了中间语言,它执行的时候还是要把dll再次编译成机器代码才能执行的
如果是这样,那它起不是和asp一样(解释执行),因为它每次执行都要把中间语言编译成机器代码
疑问2:
发布之后的网站和没有发布的网站从编译的角度讲有哪些区别,性能有多少提升,还是如我所想的发布后的网站只是帮忙做了第一次编译工作?
以上是我的2个疑问
希望高手帮忙详细解答一下,多谢了

解决方案 »

  1.   

    1.ASP.NET中,代码并未直接编译为机器语言.而是先编译成一种中间语言(MSIL).然后由JIT编译器进一步编译为机器语言. 
    客户端向服务器请求流程:
         第一次:发送一个HTTP请求,WEB服务器判断所请求的网页是否为ASP.NET的网页文件.如果是,解析器解释此源代码.如果此代码尚未被编译到DLL中,ASP.NET将调用编译器对其进行编译.然后运行时加载和执行MSIL代码. 
         第二次:运行时直接加载并执行MSIL代码以返回输出结果,因为在用户第一次访问时已编译过此代码. 
    2.网站发布其实还有一个很重要的功能就是隐藏了cs文件.保护项目不被copy.
      

  2.   

    1.net第一次执行会慢.第一次执行时会把中间语言编译成本机代码,也就是你说的二进制代码
    他会通过一个叫jit的即时编译器将中间语言(msil)编译为本机代码,第一次编译后.以后再执行就不会通过jit编译了.
    也就是说下次再运行时,将运行现有的jit编译的本机代码2.发布网站会有很多好处,利如可以保护代码.还有比如你在发布时取消允许更新此预编译站点,那么你的aspx等等页面基本上就没内容了.就只有一行代码.内容都会编译到dll中参考:http://msdn.microsoft.com/zh-cn/library/399f057w(VS.80).aspx
      

  3.   

    疑问1:发布之后的网站已经把cs都编译成了dll,它再执行的时候也需要经过2次编译解释成机器语言,这是毋庸置疑的,但是却不是编译器做的事情。
    问题2发布后的网站就是直接可以在iis上运行的,当然就不用你自己编译的,顺便说下编译不通过的站点你是不能发布成功,呵呵,也不要太钻牛角尖啊.发布之后你的cs就成了dll,库文件dll装在了cs文件的信息还有保密的机能,就像是exe后缀的一样,可以在iis上执行
      

  4.   

    其实在我们第一次打开ASP.NET网页的时候,相应的网页会被编译成dll文件,然后JIT来运行这个dll文件。一旦这个文件再次发生变化,下次第一个请求这个网页时又会被编译成dll文件。并且为了防止文件名重名,生成的dll文件采用了随机命名。
    当向服务器发送一个ASP.NET网页的请求时,在内部执行的流程:
    (1)检查在服务器内存中是否存在这个网页的对应的本地机器代码;
    (2)如果存在则执行本地机器代码,将结果返回到客户端;
    (3)如果不存在本地机器代码则检查是否存在这个网页编译后的中间代码(通常以动态链接库的形式存在),如果存在则将中间代码编译成本地机器代码,然后执行本地机器代码将结果返回给客户端,并将本地机器代码缓存到内存中;
    (4)如果不存在对应的中间代码,则将这个网页编译成中间代码,然后按照步骤(3)执行。
      

  5.   

    这也就是ASP.NET网页不同于asp或者php的地方:ASP.NET页面在第一次请求的时候会被编译成dll文件,由JIT编译成本地机器代码执行,并且将本地机器代码缓存,如果在缓存没有清空之前再次调用时会直接执行缓存中的机器代码,因而aspx页面第一次被打开的时候比较慢,而以后执行的时候就会比较快,因为以后执行的时候除非修改了代码否则就没有必要重新生.dll文件了;而asp和php网页每次运行的时候都会被解释执行,因而ASP.NET网站的总体运行速度要快。
      

  6.   

    你自己都说了第一次IL,第二次机器,编不编dll发布都是两次。
      

  7.   

    疑问1: 
    源码编译成IL和JIT即时编译IL是不同的过程和不同的概念...不能和ASP比,要比也是和Java比,原理都不同...解释器解释解释型语言的效率不是一个档次的...疑问2: 
    发布之后会去除调试信息优化IL...性能肯定会提升...
      

  8.   

    只是一个补充提示:如果你打开aspx、ascx、asmx、asax、svc等等后缀的文件,如果你看到了xhmt源代码甚至可执行的源代码,那么你的网站根本没有真正地编译,而可能仅仅编译了部分code-behind代码而已。要完整地编译为msil代码,要使用“web网站”形式创建网站,然后在发布时取消“允许更新此预编译站点”默认选项,这样才能真正编译。仔细比较一下(默认)设置此选项和取消此选项所编译出来的网站的文件的区别,就可以发现很多问题。
      

  9.   


    是的。把高级语言编译为短小精悍、通用性好的msil,与msil及时编译为最适合你的cpu的本地代码,这两个编译对“效率”的影响其实是不可比的。这种形式已经在计算机软件上流行了至少30年,不能从概念上来单纯比较它们的性能,应该实际测试它们。微软测试了它们并结合微软以外的平台(例如sun的平台)才综合选择了的。
      

  10.   

    可以参考《Net 揭密--JIT怎样运行你的代码》。看看你对jit了解多少。