我们从网上当了一个开源项目,稍加修改后加以集成。编译通过,但在发布阶段,却报了许多错误。这个开源项目是老旧的WebForm程序,新人不懂,我也早已忘得七七八八。同事没办法,直接将源代码部署到服务器。

我觉得这种做法很傻,既耗费空间又不安全。

其实只要在发布选项中,去掉“在发布期间预编译”选项就能发布。

一、在发布期间预编译

所谓预编译,是相对动态编译而言。众所周知,.NET的原理就是源代码会先编译成中间语言(IL),运行于运行时(RunningTime),由运行时再编译成机器语言执行。如果是源代码直接部署,当网站第一次打开时,系统要完整地执行以上2级编译过程,耗时就会非常长。

asp.net项目无预编译发布_控件


但从WEB项目发布结果来看,不勾选“在发布期间预编译”选项,发布出来的东西,里面也没有*.cs代码,而页面代码则完整地保留了下来。这说明,所谓的预编译选项,是对页面(.aspx)、控件(.ascx)或视图(.cshtml)而言的(以下统称为页面):勾上,页面就预编译;不勾,页面不编译;但后端代码(.cs)是无论如何都会被预编译的(编译进 bin/网站项目.dll 里。这一点,也可以从发布过程中,出错都与页面中的服务器代码有关得到印证。所以说,发布总会比源代码直接部署要强。一方面,是性能提升;另一方面,代码得到了保密。而预编译选项,内有乾坤。

asp.net项目无预编译发布_控件_02


二、预编译选项

其中,预编译选项,
1、允许更新预编译站点
勾上的话,发布之后,页面源代码会原封不动地保留。所以叫“允许更新”预编译站点。设计者的意图,估计是想着前后端分离,CS代码是后端,编译了,不能更改;页面是前端,里面的代码可以改。这个选项默认是勾选的,一般而言,应该取消。

这样岂不是与不勾上"在发布期间预编译"效果一样咯?没错,但有一点差别:勾上"在发布期间预编译",发布过程中,系统会严格检查,许多潜藏的错误,比如少CSS文件之类就会暴露出来,从而导致发布失败。

2、“不合并” 与 “不合并,为每个页面和控件创建单独的程序集
这两个有什么区别?

区别就是前者会为每个页面和控件随机生成一个dll,每次发布名字可能都不一样,所以你要是更新部署的话,直接拷贝过去覆盖,最后文件数量可能会越来越多。

而后者就是每次名字都会一样。

以上都是术,不属于知识的范畴,总结这些没有什么意思。因为以后不用.NET,或者VS自己升级了,这些都是狗屁,无声地消散于空气中。

参考文章:
​​​ASP.NET WEB 应用程序在发布期间预编译(彻底告别 .NET 网站首次访问速度慢的问题)​​​​"允许更新此预编译站点"和网站安全、首次速度的关系​


2021.02.22
在发布期间预编译这个选项,在低版本的.NET源码上需要勾上,然后再勾上“允许更新预编译站点”,否则*.cs还是会存在