VS.Net中按 F5 时项目的生成顺序

读别人的代码,我在一个类的无参公共构造函数里加了个MessageBox,但单步跟踪到这个构造函数的时候,并未执行MessageBox这句话就跳过去了,这让我好生奇怪:它有什么理由不执行呢?研究半天后恍然大悟:这是一个类库项目,而修改后我并未重新生成此类库——脑子暂时短路的结果。

但在意识到脑子短路之前,我却考虑了很多:此类继承自另一个类,难道是继承上出了问题?不厌其烦的我甚至启动Snippet Compiler,亲手写了个简单的父类、子类,包括构造函数的无参、有参、不写三种情况,把构造函数在继承中的执行方式重新复习了一遍。结果当然是一切均按预想的流程工作:构造子类对象时首先执行父类构造函数,然后再执行子类构造函数;如果子类没有构造函数,表面上看只执行了父类的构造函数,但据说实际上还执行了一个运行时提供的无参公共构造函数(书上这么说的,但跟踪不到,反正啥也没干)。

在脑子恢复正常之后,我意识到应该把VS.Net中①生成解决方案(Ctrl+Shift+F5)、②重新生成解决方案、③生成项目、④重新生成项目、⑤启动(F5)、⑥开始执行不调试(Ctrl+F5)、⑦逐语句(F11)、⑧逐过程(F10) 这些概念重新明确一下。前四个是跟目标程序的生成相关,后四个跟程序执行、调试相关。查MSDN:

①生成解决方案(Ctrl+Shift+F5):只编译自上次生成以来更改过的那些项目文件和组件。
②重新生成解决方案:首先“清理”解决方案,然后生成所有项目文件和组件。“清理”解决方案或项目将删除所有中间文件和输出文件,只留下项目文件和组件文件,以后可以
从这些文件生成中间文件和输出文件的新实例。
③生成项目:只生成自上次生成以来更改过的那些项目组件。
④重新生成项目:首先“清理”项目,然后生成项目文件和所有的项目组件。
⑤启动(F5):应用程序启动并一直运行到断点。
⑥开始执行不调试(Ctrl+F5):在不使用调试器的情况下开始执行项目,即断点不起作用。
⑦逐语句(F11):执行下一行代码,如果下一行包含函数调用,则在函数内的第一个代码行处停止。
⑧逐过程(F10):执行下一行代码,如果下一行包含函数调用,则执行整个函数,然后在函数外的第一个行处停止。

这么看以上八个概念都很简单明了,没什么难的地方,但我想搞清楚的是如果不“生成”,直接执行调试,比如按F5后VS.Net如何处理生成呢?

可以肯定的是,按F5后当前项目肯定要执行生成操作,至于同一解决方案下的其它项目,是否要生成及按何种顺序生成,取决于以下几个因素:

因素一:是否当前项目的依赖项

依赖项若是以.Net类库的形式被添加到当前项目的引用中,则缺省情况下并未打对勾;若添加引用时依赖项是以项目的形式添加,则缺省就是打了对勾,且为灰显不能去掉。

VS.Net的处理方式:在任何情况下依赖项都会生成,顺序上优先于当前项目。

因素二:项目生成顺序


项目生成顺序受“项目依赖项”对话框内的设置影响,应该以相反的顺序选择项目,即最先选择需要最后生成的项目。

VS.Net的处理方式:按照“项目生成顺序”中指定的顺序生成。

因素三:VS.Net 的选项设置中是否选择了“仅在运行时生成启动项目和依赖项”选项。

MSDN中说该选项影响 ①生成解决方案(Ctrl+Shift+F5) 和 ⑤启动(F5) 两个命令,但经我测试发现影响①、⑤、⑥、⑦、⑧五个命令,其实⑤、⑥、⑦、⑧就VS.Net的生成事件而言是一回事。

VS.Net的处理方式:若打勾,则仅生成当前启动项目及其依赖项;否则将会生成所有项目、它们的依赖项以及解决方案文件。

至此,项目的生成问题算是搞得比较清楚了,但还有两个问题不甚明了:
1. 设计一个类时,空的公共无参构造函数有没有必要写?本来是不必要写的,运行时会默认提供;但若写了会方便调试,不会出现跟踪不到的情况。
2. 如果按照解释执行的语言、编译执行的语言来分类,C#应该算哪种呢?.Net下有没有翻译执行、编译执行的概念呢?

posted on 2004-08-27 17:14  阳春三月  阅读(2097)  评论(1编辑  收藏  举报

导航