在 模型中vs已经完全脱离了编译而成为了一个彻底的ide算是一个不小的改动其中更是取消了有关Web Application的概念使得习惯了vs的人刚开始的时候会有一些摸不着头脑下面简单说一下我在使用过程中自己总结的算是一点经验
新建web工程并且位置是文件系统的时候vs只是帮你建好了一个sln文件这个东西只是指引msbuild 如何进行编译的过程是ide 调用 msbuild msbuild解析sln文件msbuild调用aspnet_compilerexe进行网站的编译所以aspnet_compilerexe只是负责进行网站的编译的
预编译的概念在framework 里面就存在了vs中的预编译指的是将页面对应的cs/vb文件与resx文件编译后统一集成到一个dll中放到bin目录下将aspx文件直接拷贝过去这样做会留下隐患因为aspx文件就直接暴露在最后的发行包中如果完全是codebbehind模型还好只能改改界面如果采用了页面上的来生成页面源代码就暴露了针对这些问题vs采用了一种新的模式
请参看ASPNET 编译工具 (Aspnet_compilerexe) 这篇文章了解对各种文件的处理方式
IDE发布
vs中选择 生成〉发布网站在对话框中的操作将映射到aspnet_compilerexe的参数中可更新的发布对应 u其他选项类似请参考上面的文章了解
注意发布时将忽略nfig中的debug?问骋簧晌薜魇孕畔⒌奈募?
手工编译
简单说来如果是无更新发布模式编译appcode下面的class编译成dll放在bin下页面内容清空位置不变作占位用同时页面被编译成一个随机名称的dll增加一个同piled文件到bin目录下内容大概如下
<?xml version= encoding=utf?>
<preserve resultType= virtualPath=/Forum/AdminListaspx hash=c filehash=fdc flags= assembly=App_Web_hmrycgw type=ASPforum_adminlist_aspx>
<filedeps>
<filedep name=/Controls/footerascx />
<filedep name=/Controls/headerascx />
<filedep name=/Forum/AdminListaspx />
<filedep name=/Forum/AdminListaspxcs />
<filedep name=/Forum/menuascx />
<filedep name=/Forum/menuascxcs />
</filedeps>
</preserve>
里面只是列出了页面上的customcontrol这里已经完成了和masterfile的映射这样最大限度的保护了页面的敏感信息发布过的网站中只能看见一堆文件名了可更新的发布模式与vs类似页面就直接拷贝过来不予编译了
讲了一堆原理下面说一下aspnet_compilerexe的调用方法这是我使用的例子
我的开发目录是这样的
Project/
library/
devroot/
pubroot/
projsln
使用的命令如下
aspnet_compiler v / p \devroot f \pubroot
分析
v / 指明了iis的虚拟目录
p \devroot 表示代码实际位置
\pubroot 指明了要发布的位置
f 表示强制改写目标位置
你还可以用u来进行传统意义上的预编译d来插入编译符号