VS05发布网站遇到的几个问题
项目做完需要把整个项目传到空间中。由于VS05改变了以往03的发布“习惯”。本人在实践中也遇到了不少问题,先把问题分析出来供以后学习参考。
我想发布网站最需要注意的地方就是生成DLL文件了,并且要像VS03中那样方便以后维护。VS05生成DLL有三种方法;
一、使用VS自带的“发布网站”功能。
第一步:
第二步:
剩下的就是把这些文件全部传到空间中即可。这里需要注意的是发布网站的时候需要把项目中的数据库停用,这样才可以发布。使用这种方法在以后维护网站的时候不是非常方便。系统会在BIN文件夹下随机生成很多DLL文件,如果用过VS03的朋友就会知道,以后维护起来非常费事。那就接着往下看吧,另一种发布的方法。
二、利用微软出的插件WebDeployment生成单一程序集(一个DLL文件)
没有插件的朋友自己到网上找吧,这里就不提供下载地址了。在装好插件之后VS05菜单的生成中会多了一个选项Add Web Deployment Projiect或者直接在项目中鼠标点击右键也会看到 如下面两幅图
第一步:点击Add Web Deployment Project选项出现如图所示
Name是生成程序集(DLL文件)的名称;Location是发布位置(这里要注意目录不能选择当前项目目录),选好之后点击OK,这时您的项目中就会多了一个以刚才Name命名的解决方案jinwb,如图:
第二步:鼠标右击该解决方案,选择【属性页】 弹出如图选项
找到OutPut Assemblies 选项卡;选择Merge all outputs to a single assembly 并勾选下面的 Treat as library component(remove the App_Code.compiled file) 或者选择Merge all pages and control outputs to a single assembly 为程序集起好名,其他不做修改,点击确定
Output Assemblies中的四大选项:
1. Merge all outputs to a single assembly-所有输出都编译成一个程序集(参数:程序集名称)
1.1 Treat as library component (remove the App_Code.compiled file)-App_Code视为类库(删除App_Code.compiled文件)
2. Merge each individual folder output to its own assembly-WEB项目中单独的目录会编译到一个程序集中(参数:程序集前缀)
3. Merge all pages and control outputs to a single assembly-所有页面控件编译到一个程序集中(参数:程序集名称)
4. Create a separate assembly for each page and control output-为每一个页面和控件创建程序集Signing使用 key文件建立强命名空间的程序集
第三步:点击新增项目的生成。如图:
余下的工作就是等待系统生成了。
注意:如发布报出"aspnet_merge.exe”已退出,代码为1的错误
解决方法:
1.将VS 2005的工具-选项-项目和解决方案-生成并运行,设置“MSBuild 项目生成输出详细信息”,选择“详细”。再次生成Web Deployment Projects项目
2.Microsoft Visual Studio 2005——>视图——>输出,“输出”框内的信息就变得非常丰富了;
3.Web Deployment 重新发布
这样就可以查看哪里出错了;
果然,再次发布,错误显示:
An error occurred when merging assemblies: ILMerge.Merge: ERROR!!: Duplicate type ‘web_left’ found in assembly 'App_Web_k7ytr'
它的意思是说web_left的类,已经存在了,我去项目里搜索这个字符串,果然,出现了四次;两次是在cs文件中的class定义处,另两处自然是页面的inherits调用处;
不用说,这是某个程序员在复制页面时,没有做任何改动,连cs引用也没有改;马上改了,再次生成;
又停了下来,提示与前面一样,只是类名不同罢了,看来同样的错误有很多,再改,然后再生成,根据提示,找到错误处,再改;生成是好慢的,最终,生成成功!呵呵;所有的cs生成的dll合成了一个dll;
在页面的头部,cs引用处,变成了
<%@ page language="C#" autoeventwireup="true" inherits="web_GovOpen_Article, BuilderWeb" enableEventValidation="false" viewStateEncryptionMode="Never" %>
注意,inherits处,引用的dll名称,不再带有随机数了;
再说些其它的,在VS2005的“输出”窗口中,还看了这样的信息
命令:
C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_compiler.exe -v /webSite -p "D:/项目二期/webSite" -u -f -d "D:/项目二期/BuilderWeb/webRoot//"
任务“AspNetCompiler”正在使用“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_compiler.exe”中的“aspnet_compiler.exe”。
挺熟悉的,原来它是用aspnet_compiler.exe来生成的,当初自己还用它的命令行形式自己搞过呢;
再看后面
Running aspnet_merge.exe ...
命令:
C:/Program Files/MSBuild/Microsoft/WebDeployment/v8.0/aspnet_merge.exe "D:/项目二期/BuilderWeb/webRoot" -o BuilderWeb -debug -copyattrs
任务“AspNetMerge”正在使用“C:/Program Files/MSBuild/Microsoft/WebDeployment/v8.0/aspnet_merge.exe”中的“aspnet_merge.exe”。
不用问,aspnet_merge.exe的功能是合并dll文件了;
正是因为aspx引用的cs文档中的类重名,所以在合并时才会报错,以前是分开在不同的dll中的,重名问题没有暴露出来,合并了就出问题了;
现在明白这个“代码为1的错误”
生成好之后你会在先前选择发布位置中看到含有自己命名的程序集(一个DLL文件)的项目。其中的CS文件已经没有了。这时你可以吧这些文件传到空间中了。像VS03一样,以后维护网站的时候重复上述步骤,只传递DLL文件即可。(注意一下:生成网站的时候如果项目中存在数据库的话,要停止数据库服务才能发布成功)
接下来说说用这种方法遇到的几个问题;
再发布网站之后我想在本机进行测试一下,我先删除了生成之前的项目。然后把生成后的文件拖到了删除之后项目的文件夹,打开VS05 提示如图:
这里点击“是”就行了,原因是你所打开的项目已经编译过了。设置好起始页之后F5运行提示:已预编译此应用程序,解决方法是把文件中的 PrecompiledApp.config删除即可。再次运行又出现错误。提示错Cannot find any assemblies that can be merged in the application bin folder. 解决方法是删除发布网站时候生成的项目即可解决
三、升级VS05到SP1 新建项目中会有Web Application Project 这种是微软后增加的网站开发模式。与Web Site Project不同,这种模式也可以生成单一程序集。这里就不在说明了。大家可以试一下。不过具网上有人说这种模式不是非常好。