1、如何用VS制作Web安装程序如何用VS2005制作Web安装程序网站完成后,需要部署到目标机器上,方法有很多,直接把文件 Copy 到目标机器上,执行 SQL 脚本,配置 IIS ,这样可以做到;也可以使用 InstallShield 这样到专业制作软件来打包。本篇文章是使用 VS2005 自带到安装部署工具来制作 exe 安装文件。 涉及到到内容包括:使用安装部署工具,建立数据库,配置 IIS ,文件操作,注册表等。参考了网上关于使用 VS 制作安装程序的文章。环境: Windows2003 + VS2005 + SQL2005 。 注:本文只是为了实现,没有强调方法,变量等的写法标准。 使
2、用 VS2005 制作安装程序的时候,有多种选择,如下图: 我想一般常用的可能就最上面的两种。当使用 Web 安装项目时,执行制作好的 msi 安装文件时,会发现实际上是添加虚拟目录而不是添加网站,而且无法选择安装目录,当然,可以自己写脚本来对 IIS 进行修改。不过在这篇文章里,将不采用此模式。本篇文章用的是使用“安装项目”,就和打包 WinForm 程序一样,把 Web 文件部署到目标机器上,然后重写 install 方法,配置 IIS ,执行 SQL 脚本,修改 web.config 文件等。 在开始整个过程之前,需要先了解一下“预编译”的概念, MSDN 上的说明是:默认情况下,在用户
3、首次请求资源(如网站的一个页)时,将动态编译 ASP.NET 网页和代码文件。第一次编译页和代码文件之后,会缓存编译后的资源,这样将大大提高随后对同一页提出的请求的效率。请查阅 MSDN “预编译”相关文档。 准备一个文件 DBSQL.txt ,在里面包含连接数据库后需要执行的 SQL 脚本,在本例中使用了简单的一个 Create Tabel 的 SQL 。 好了,现在开干,吼吼 打开 VS2005 ,打开一个网站项目,这里是打开的本地 localhost ,如图: 新加一个页面,随便取个名字(本文中为 ClientCallback.aspx ),然后写一个简单的按钮事件即可,这不是本文的重点
4、,由你随意处理 _ 再添加 web 配置文件即 web.config ,在 下添加 此文件到时候是需要发布到目标机器上的。(关于连接数据库字符串, VS2005 里面有专门的 connectionStrings ,本文未使用,可查阅帮助) 点击生成网站,访问页面, ok ! 选择菜单生成发布网站: 点击确定后,网站已经生成,这些就是需要部署到目标机器上的所有文件。 点击菜单文件添加新建项目,添加安装部署项目,如图: 添加安装项目类库: 删除默认的 Class1.cs, 新加一个安装程序类文件,名为 MyInstaller.cs : 在此项目中,添加对 System.EnterpriseServ
5、ices 和 System.DirectoryServices 的引用,在操作 IIS 的时候,需要用到。在文件中添加: using System;using System.IO;using System.DirectoryServices;using System.Reflection;using System.Data;using System.Data.SqlClient;using System.Configuration.Install;using System.Management;using System.Collections;using Microsoft.Win32;usi
6、ng System.Collections.Specialized;如果编译的时候出错,请添加相关引用。 修改文件如下图: 注意要手动添加 Installer ! 将 DBSQL.txt 文件放到此项目中,在属性中设置为“嵌入的资源” 回到 MyWebSetup 项目,点击查看属性,可以设置安装文件到显示相关信息,如图 选择文件系统,如图: 然后: (在文件系统中,在属性里面可以设置安装程序默认到安装路径) 添加一个叫 bin 文件夹并添加在生成网站时 bin 目录下的 dll 文件,如图: 在应用程序文件夹下在生成网站时目录下的文件,添加后如图: 选择“用户界面编辑器”,添加两个文本框 A
7、和 B , A 将作为安装新站点后的 IIS 设置, B 将作为数据库操作时的参数设置,调整位置后如下: 调整 A 的属性,这里只选择了显示两个输入框,属性分别为 IISSERVER 和 PORT ,值为 localhost 和 9998 ,其他的你可以自己调整。如图: 文本框 B 的设置如下: OK ,文本框设置完毕。当然,你还可以选择其他的多种文本框,如协议什么的。 打开自定义操作面板: 然后: 在 CustomActionData 中输入: /dbname=DBNAME /server=DBSERVERNAME /user=USERNAME /pwd=PASSWORD /iis=IISS
8、ERVER /port=PORT /targetdir=TARGETDIR 这些参数就是文本框 A 和 B 上的输入框的值,在安装过程中可以获得,然后进行处理。 至此,基本的安装文件已经制作完毕。进行生成,然后点击安装,可以看到文件已经复制到了相应到目录。接下来就要接收参数对 IIS 和数据库进行处理。 打开SetupClassLibrary项目下的MyInstaller.Designer.cs,修改此文件。申明几个变量:private System.Data.SqlClient.SqlConnection sqlConn;private System.Data.SqlClient.SqlCo
9、mmand Command;privatestring DBName;privatestring ServerName;privatestring AdminName;privatestring AdminPwd;privatestring iis;privatestring port;privatestring dir;publicstaticstring VirDirSchemaName = IIsWebVirtualDir;privatestring _target;private DirectoryEntry _iisServer;private ManagementScope _sc
10、ope;private ConnectionOptions _connection;连接数据库服务器到方法:#region ConnectDatabase 连接数据库privatebool ConnectDatabase()if (Command.Connection.State != ConnectionState.Open)tryCommand.Connection.Open();catch(Exception e)returnfalse;returntrue;#endregion如果不能正确连接数据库服务器,请检查你的连接字符串,或者将连接字符串写入文件查看。不好意思,我不知道如何对这种
11、安装部署程序进行debug,sorry咯!读取SQL文件的方法:#region GetSql 从文件中读取SQL,在读取包含SQL脚本的文件时需要用到,参考自MSDNprivatestring GetSql(string Name)tryAssembly Asm = Assembly.GetExecutingAssembly();Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + . + Name);StreamReader reader = new StreamReader(strm);return reader.
12、ReadToEnd();catch (Exception getException)thrownew ApplicationException(getException.Message);#endregion可以将此需要执行的SQL脚本放在此文本中执行SQL语句的方法:#region ExecuteSql 执行SQL语句,参考自MSDNprivatevoid ExecuteSql(string DataBaseName, string sqlstring)Command = new System.Data.SqlClient.SqlCommand(sqlstring, sqlConn);if
13、(ConnectDatabase()tryCommand.Connection.ChangeDatabase(DataBaseName);Command.ExecuteNonQuery();finallyCommand.Connection.Close();#endregion创建数据库及数据库表:#region CreateDBAndTable 创建数据库及数据库表,参考自MSDNprotectedbool CreateDBAndTable(string DBName)bool Restult = false;tryExecuteSql(master, USE MASTER IF EXIST
14、S (SELECT NAME FROM SYSDATABASES WHERE NAME= + DBName + ) DROP DATABASE + DBName);ExecuteSql(master, CREATE DATABASE + DBName);ExecuteSql(DBName, GetSql(DBSQL.txt);Restult = true;Catchreturn Restult;#endregion从备份文件恢复数据库及数据库表#region RestoreDB 从备份文件恢复数据库及数据库表/ / 从备份文件恢复数据库及数据库表/ / 数据库名/ 配件中数据库脚本资源的名称/
15、 protectedbool RestoreDB(string DBName)dir = this.Context.Parameterstargetdir;bool Restult = false;string MSQL = RESTORE DATABASE + DBName + FROM DISK = + dir + data.bak + WITH MOVE Test TO + c: + DBName + .mdf, + MOVE Test_log TO + c: + DBName + .ldf ;tryExecuteSql(master, USE MASTER IF EXISTS (SEL
16、ECT NAME FROM SYSDATABASES WHERE NAME= + DBName + ) DROP DATABASE + DBName);ExecuteSql(master, MSQL);Restult = true;finally/ 删除备份文件tryFile.Delete(dir + data.bak);catchreturn Restult;#endregion这里可以到注册表读取 SQL Server 的安装路径,把恢复后的数据库文件放到 data 目录地下。在本例中,只是实现了恢复,并未进行标准的操作。其中 Test 和 Test_log 时备份时数据库的文件信息。如果
17、想要从备份文件中恢复,请把文件包含到项目里并且设置和 DBSQL.txt 一样,嵌入到程序里。最后执行删除。不过我想应该有办法不把文件先安装到目标机器上,而是有方法想读取 DBSQL.txt 文件一样,直接恢复数据库,不过确实没想到办法,失败! 网站安装好后,需要设置 web.config 文件,这里只涉及到连接字符串到设置,其他的可以同理修改。 从备份文件恢复数据库及数据库表#region WriteWebConfig 修改web.config的连接数据库的字符串privatebool WriteWebConfig()System.IO.FileInfo FileInfo = new Sys
18、tem.IO.FileInfo(this.Context.Parameterstargetdir + /web.config);if (!FileInfo.Exists)thrownew InstallException(Missing config file : + this.Context.Parameterstargetdir + /web.config);System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();xmlDocument.Load(FileInfo.FullName);bool FoundIt =
19、false;foreach (System.Xml.XmlNode Node in xmlDocumentconfigurationappSettings)if (Node.Name = add)if (Node.Attributes.GetNamedItem(key).Value = ConnectionString)Node.Attributes.GetNamedItem(value).Value = String.Format(Persist Security Info=False;Data Source=0;database=1;User ID=2;Password=3;Packet
20、Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1, ServerName, DBName, AdminName, AdminPwd);FoundIt = true;if (!FoundIt)thrownew InstallException(Error when writing the config file: web.config);xmlDocument.Save(FileInfo.FullName);return FoundIt;#endregion从备份文件恢复数据库及数据库表#region WriteRegistryKe
21、y 写注册表。安装部署中,直接有一个注册表编辑器,可以在那里面设置。privatevoid WriteRegistryKey()/ 写注册表RegistryKey hklm = Registry.LocalMachine;RegistryKey cqfeng = hklm.OpenSubKey(SOFTWARE, true);RegistryKey F = cqfeng.CreateSubKey(cqfeng);F.SetValue(FilePath, kkkk);#endregion操作IIS,建立网站等。可参考:用VS2005制作网页对IIS进行操作#region Connect 连接II
22、S服务器publicbool Connect()if (iis = null)returnfalse;try_iisServer = new DirectoryEntry(IIS:/ + iis + /W3SVC/1);_target = iis;_connection = new ConnectionOptions();_scope = new ManagementScope( + iis + rootMicrosoftIISV2, _connection);_scope.Connect();catchreturnfalse;return IsConnected();publicbool I
23、sConnected()if (_target = null | _connection = null | _scope = null) returnfalse;return _scope.IsConnected;#endregion#region IsWebSiteExists 判断网站是否已经存在publicbool IsWebSiteExists(string serverID)trystring siteName = W3SVC/ + serverID;ManagementObjectSearcher searcher = new ManagementObjectSearcher(_s
24、cope, new ObjectQuery(SELECT * FROM IIsWebServer), null);ManagementObjectCollection webSites = searcher.Get();foreach (ManagementObject webSite in webSites)if (string)webSite.PropertiesName.Value = siteName)returntrue;returnfalse;catchreturnfalse;#endregion#region GetNextOpenID 获得一个新的ServerIDprivate
25、int GetNextOpenID()DirectoryEntry iisComputer = new DirectoryEntry(IIS:/localhost/w3svc);int nextID = 0;foreach (DirectoryEntry iisWebServer in iisComputer.Children)string sname = iisWebServer.Name;tryint name = int.Parse(sname);if (name nextID)nextID = name;catchreturn +nextID;#endregion#region CreateWebsite 添加网站publicstring CreateWebSite(string serverID, string serverComment, string defaultVrootPath, string HostName, string IP, string Port)tryManagementObject oW3SVC = new ManagementObject(_scope, new ManagementPath(IIsWebService=W3SVC), null);if (IsWebSiteExists(serverID)
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1