使用aspnet_compiler对web程序进行预编译
前言
本例使用的是asp.net中的webform项目,使用.net框架为.net3.5
操作步骤
正常的web项目发布步骤
发布方法:文件系统
目标位置:发布后的项目文件的路径,可自定义。

打开windows资源管理器,可以看到发布后的相关文件

打开VS2008的命令提示符工具

在命令提示符中输入 命令,并回车
参数说明:
aspnet_compiler.exe aspnet_compiler命令
-v \ 要编译的虚拟路径,这里表示根路径。
-p E:\WebIIS\EIS 要编译的源Web项目所在文件夹。
E:\WebIIS\EIS_Precompiled 编译目标文件夹。
-fixednames 每个.aspx与.ascx文件都编译生成单独的dll文件,并使用固定文件名。
注:执行前,需要将预编译文件夹中的内容清空,否则命令提示符窗口无法执行预编译操作。

回车执行。会执行一段时间。。。。。。



防止某些页面被遗漏
发布的文件夹-> E:\WebIIS\EIS
预编译的文件夹-> E:\WebIIS\EIS_Precompiled
全选E:\WebIIS\EIS文件夹中的所有文件,复制到E:\WebIIS\EIS_Precompiled。粘贴所有文件,按照提示复制和替换已存在的文件。


此时
预编译的文件夹-> E:\WebIIS\EIS_Precompiled ,此文件夹中的文件即为发布到服务器上的文件。
将该文件夹压缩为EIS_Precompiled.zip,发送至服务器。再将压缩包解压,所有文件放置到IIS对应的文件夹中即可。
至此,asp.net程序的发布预编译结束。
预编译工具的选择
前言
本例中的项目是使用VS2010编写的,刚开始进行预编译操作是使用VS2010命令提示符进行的。
但是将预编译后的文件发布到服务器上后,竟然无法访问。
于是按照同事的操作步骤,安装了VS2008,使用VS2008命令提示符进行预编译操作。
但是又想着,只是为了预编译而安装了个VS2008,是不是太浪费资源了。
经百度得到简易方法。
原博文
http://blog.csdn.net/fer_ba/article/details/5766568
示例
(1)使用CMD命令提示符,进行操作。这种方法其实是VS2008命令提示符的手动执行操作。
第一步:切换到aspnet_compiler.exe所在目录
在“命令提示符”下,切换到所在目录“c:/windows/microsoft/framework/v2.0.50727”。
第二步:运行aspnet_compiler.exe预编译
Aspnet_Compiler -v test c:/tmp/test
-v是虚拟目录参数,test为虚拟目录名称,而c:/tmp/test是指先行编译后的程序文件的目的位置。
第三步:使用预编译后的网站
将预编译后的test目录Copy到正式网页服务器,部署网站。
但要注意:aspnet_compiler.exe不会对静态文件如:Web.config、文本文件和图片文件等进行编译,所以像数据库连接字符串请用aspnet_regiis.exe工具来进行加密。
网站预编译后,以后也不会触发重新动态编译,故请不要事后再加入新的.aspx文件,那样不会有任何作用。
按照本例的目录,进行实际的使用。经过预编译后的文件可以正常的访问。

(2)通过ClientBuildManager类进行编译
string vdir = "/MyDataSource"; //虚拟目录名称
string srcLocation = "c://Inetpub//wwwroot//VS2005IDE"; //来源位置
string tarLocation = "c://tmp//VS2005IDE"; //目标位置
System.Web.Compilation.ClientBuildManager cbm = new System.Web.Compilation.ClientBuildManager(vdir,srcLocation,tarLocation);
cbm.PrecompileApplication(); //预编译
按照本例的目录,进行实际的使用。经过预编译后的文件可以正常的访问。
其中有三个参数,
// 摘要:
// 使用指定的目标目录初始化 System.Web.Compilation.ClientBuildManager 类的新实例。
// 参数:
// appVirtualDir:
// 应用程序根目录的虚拟路径。
// appPhysicalSourceDir:
// 应用程序根目录的物理路径。
// appPhysicalTargetDir:
// 用于预编译的目标目录。
public ClientBuildManager(string appVirtualDir, string appPhysicalSourceDir, string appPhysicalTargetDir);
我将虚拟路径设置为空,应用程序根目录的物理路径设置为E:\\WebIIS\\EIS(程序发布的路径),预编译的目标目录,设置为E:\\WebIIS\\EIS_Precompiled(预编译后的目录)

总结
(1)前言
经过测试发现,使用VS2010和VS2008的命令提示符进行操作时,只有VS2008命令提示符的预编译结果可以执行。
在使用System.Web.Compilation.ClientBuildManager类进行预编译时,
发现其使用的dll文件目录就是在C:\Windows\Microsoft.NET\Framework\v2.0.50727目录中。

而我部署的IIS应用程序池的版本也是.net2.0

(2)猜测
而我使用VS2010时可能使用的是C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe目录下的程序,然后和IIS的版本不一致导致的无法访问。
(3)为了验证这个猜测,
我使用.net4.0目录下的aspnet_compiler进行预编译,IIS环境仍然是.net2.0。运行结果如下,运行出错。

然后将IIS的.net版本修改为.net4.0进行测试,结果如下,仍然报错。

(4)百度寻找答案,搜索到相关问题。
原博文
https://www.2cto.com/kf/201109/103431.html
其中有着一段话:利用aspnet_compiler预编译,该程序工具两个版本, Framework2.0和4.0,位于WINDOWS\Microsoft.NET\Framework\版本号的文件夹内,前者适用于2.0\3.0\3.5的asp.net网站,后者是针对4.0及更高版本的asp.net。

而我使用的web程序使用的.net框架是.net3.5,
也就是得使用C:\Windows\Microsoft.NET\Framework\v2.0.50727\aspnet_compiler.exe文件,
而非C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe文件。
如此一来,上面使用.net4.0版本的预编译工具编译后,无法访问也就可以理解了。
(5)剩下的猜测
VS2008命令提示符工具调用的是.net2.0版本的aspnet_compiler预编译工具,
VS2010命令提示符工具调用的是.net4.0版本的aspnet_compiler预编译工具。
具体的验证,我也尝试去研究但是因为不懂bat脚本的语法,而无法进行下去。
(6)关于(5)猜测的验证

VS2008命令提示符的属性,其中目标的值:%comspec% /k ""C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcvarsall.bat"" x86
找到该vcvarsall.bat文件后,其内容为
@echo off
if "%1" == "" goto x86
if not "%2" == "" goto usage if /i %1 == x86 goto x86
if /i %1 == amd64 goto amd64
if /i %1 == x64 goto amd64
if /i %1 == ia64 goto ia64
if /i %1 == x86_amd64 goto x86_amd64
if /i %1 == x86_ia64 goto x86_ia64
goto usage :x86
if not exist "%~dp0bin\vcvars32.bat" goto missing
call "%~dp0bin\vcvars32.bat"
goto :eof :amd64
if not exist "%~dp0bin\amd64\vcvarsamd64.bat" goto missing
call "%~dp0bin\amd64\vcvarsamd64.bat"
goto :eof :ia64
if not exist "%~dp0bin\ia64\vcvarsia64.bat" goto missing
call "%~dp0bin\ia64\vcvarsia64.bat"
goto :eof :x86_amd64
if not exist "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat" goto missing
call "%~dp0bin\x86_amd64\vcvarsx86_amd64.bat"
goto :eof :x86_ia64
if not exist "%~dp0bin\x86_ia64\vcvarsx86_ia64.bat" goto missing
call "%~dp0bin\x86_ia64\vcvarsx86_ia64.bat"
goto :eof :usage
echo Error in script usage. The correct usage is:
echo %0 [option]
echo where [option] is: x86 ^| ia64 ^| amd64 ^| x86_amd64 ^| x86_ia64
echo:
echo For example:
echo %0 x86_ia64
goto :eof :missing
echo The specified configuration type is missing. The tools for the
echo configuration might not be installed.
goto :eof
再根据 %~dp0bin\vcvars32.bat,找到C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\bin\vcvars32.bat
其内容为
"%VS90COMNTOOLS%vsvars32.bat"
里面是bat脚本,研究终止。
所以,我仍无法解释原因。
还望知晓者能告知,以解我迷惑之处。
使用aspnet_compiler对web程序进行预编译的更多相关文章
- [HttpException (0x80004005): 应用程序已预编译,因此不允许使用目录“/App_Code/”。]
删除网站下的PrecompiledApp.config文件即可.
- [转][ASP.NET]ASP.NET 预编译网站
[转自]https://msdn.microsoft.com/zh-cn/library/ms227430(v=vs.80).aspx C:\Windows\Microsoft.NET\Framewo ...
- 预编译命令 #if DEBUG
在控制台程序根据预编译命令: http://www.askapache.com/windows/advanced-batch-scripting.html namespace SXGYCarTrans ...
- C预编译, 预处理, C/C++头文件, 编译控制,
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...
- 预编译头文件pch
1. 预编译头文件 作用:提高编译效率.预编译头文件(扩展名为.PCH),是为了提高编译效率而使用的一种方法,把一个工程中较稳定的代码预先编译好放在一个文件(.PCH)里.避免每次编译 ...
- VC++ 使用预编译头
一.使用默认的预编译头 要使用预编译头,我们必须指定一个头文件,这个头文件包含我们不会经常改变的代码和其他的头文件,然后我们用这个头文件来生成一个预编译头文件(.pch文件),想必大家都知 ...
- c++中 预编译头文件PCH
转载:https://blog.csdn.net/lovemysea/article/details/74858430 一.预编译头文件使用经验: 如果预编译头文件被正确使用时,它确实大大提高我们编程 ...
- .net web程序发布之后,出现编译错误
.net web程序发布之后,在IIS上浏览的时候出现编译错误. CS0016: 未能写入输出文件“c:\Windows\Microsoft.NET\Framework\v4.0.30319\Temp ...
- 【转贴】 Flex 预编译处理 与 手机项目、Web项目、Air项目自由转换
原文连接: http://bbs.9ria.com/forum.php?mod=viewthread&tid=263350#lastpost 由于这个论坛不稳定,所以转到这里来,这个帖子蛮有用 ...
随机推荐
- Win搭建JAVA环境
一:下载JDK 下载链接:https://www.oracle.com/java/technologies/javase-downloads.html 选择你的系统环境进行下载 二:安装JDK 直接运 ...
- jmeter测试udp
jemter本身不支持udp测试,需要下载安装第三方插件,或者下载一个插件管理器(下面那个蝴蝶一样的图标),里面有各种插件可以供你下载 下载链接:https://jmeter-plugins.org/ ...
- AcWing 298. 围栏 (POJ1821)
标签(空格分隔): dp 单调队列优化 题目描述 有N块木板从左到右排成一行,有M个工匠对这些木板进行粉刷,每块木板至多被粉刷一次. 第 i 个木匠要么不粉刷,要么粉刷包含木板 \(S_i\) 的,长 ...
- jmp使用
jps -l jmap 36429 jmap -heap 36429 jmap -histo:live 36429 jmap -clstats 36429 jmap -finalizerinfo 3 ...
- 「刷题笔记」AC自动机
自动AC机 Keywords Research 板子题,同luoguP3808,不过是多测. 然后多测不清空,\(MLE\)两行泪. 板子放一下 #include<bits/stdc++.h&g ...
- PyQt(Python+Qt)学习随笔:QTableView的cornerButtonEnabled属性
老猿Python博文目录 老猿Python博客地址 cornerButtonEnabled属性用于控制是否启用左上角的按钮.如果此属性为True,则启用视图左上角的按钮,单击此按钮将选择表视图中的所有 ...
- 直接插入排序(python实现)
这篇博文用来介绍直接插入排序 直接插入排序基本思想: 每次将一个待排序的记录插入到已经排好序的数据区中,直到全部插入完为止 直接插入排序算法思路: 在直接插入排序中,数据元素分为了有序区和无序区两个部 ...
- MySQL-索引分类及使用索引
1.什么是索引? 索引:存储引擎用于快速找到记录的一种数据结构,默认使用B-Tree索引.索引是存储引擎层中实现.简单理解为:排好序的快速查找数据结构 索引的目的:提高数据查询的效率,优化查询性能,就 ...
- JS "&&"操作符妙用
首先来了解一下 "&&"操作符的工作原理: "&&"连接两个表达式,当两侧表达式都为真时,返回TRUE.有一个为假则返回FALS ...
- Scrum冲刺_Day07
一.团队展示: 1.项目:light_note备忘录 2.队名:删库跑路队 3.团队成员 队员(不分先后) 项目角色 黄敦鸿 后端工程师.测试 黄华 后端工程师.测试 黄骏鹏 后端工程师.测试 黄源钦 ...