用VisualStudio制作Web安装程序_第1页
用VisualStudio制作Web安装程序_第2页
用VisualStudio制作Web安装程序_第3页
用VisualStudio制作Web安装程序_第4页
用VisualStudio制作Web安装程序_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

如何用VS2005制作Web安装程序网站完成后,需要部署到目标机器上,方法有很多,直接把文件Copy到目标机器上,执行SQL脚本,配置IIS,这样可以做到;也可以使用InstallShield这样到专业制作软件来打包。本篇文章是使用VS2005自带到安装部署工具来制作exe安装文件。涉及到到内容包括:使用安装部署工具,建立数据库,配置IIS,文件操作,注册表等。参考了网上关于使用VS制作安装程序的文章。环境:Windows2003+VS2005+SQL2005。注:本文只是为了实现,没有强调方法,变量等的写法标准。使用VS2005制作安装程序的时候,有多种选择,如下图:我想一般常用的可能就最上面的两种。当使用Web安装项目时,执行制作好的msi安装文件时,会发现实际上是添加虚拟目录而不是添加网站,而且无法选择安装目录,当然,可以自己写脚本来对IIS进行修改。不过在这篇文章里,将不采用此模式。本篇文章用的是使用“安装项目”,就和打包WinForm程序一样,把Web文件部署到目标机器上,然后重写install方法,配置IIS,执行SQL脚本,修改web.config文件等。在开始整个过程之前,需要先了解一下“预编译”的概念,MSDN上的说明是:默认情况下,在用户首次请求资源(如网站的一个页)时,将动态编译ASP.NET网页和代码文件。第一次编译页和代码文件之后,会缓存编译后的资源,这样将大大提高随后对同一页提出的请求的效率。请查阅MSDN"预编译”相关文档。准备一个文件DBSQL.txt,在里面包含连接数据库后需要执行的SQL脚本,在本例中使用了简单的一个CreateTabel的SQL。好了,现在开干,吼吼打开VS2005,打开一个网站项目,这里是打开的本地localhost,如图:解决方案资源管理器-http://localho5t/▼牛Xhttp^Z/localhost/.^^uick^tartvSOSReports匕"Report5erver

新加一个页面,随便取个名字(本文中为ClientCallback.aspx),然后写一个简单的按钮事件即可,这不是本文的重点,由你随意处理A_A再添加web配置文件即web.config,在下添加此文件到时候是需要发布到目标机器上的。(关于连接数据库字符串,VS2005里面有专门的connectionStrings,本文未使用,可查阅帮助)点击生成网站,访问页面,ok!选择菜单生成=》发布网站:点击确定后,网站已经生成,这些就是需要部署到目标机器上的所有文件。点击菜单文件=》添加=》新建项目,添加安装部署项目,如图:

添加安装项目类库:

删除默认的Class1.cs,新加一个安装程序类文件,名为MyInstaller.cs:在此项目中,添加对System.EnterpriseServices和System.DirectoryServices的引用,在操作IIS的时候,需要用到。在文件中添加:usingSystem;usingSystem.IO;usingSystem.DirectoryServices;usingSystem.Reflection;usingSystem.Data;usingSystem.Data.SqlClient;usingSystem.Configuration.Install;usingSystem.Management;usingSystem.Collections;usingMicrosoft.Win32;usingSystem.Collections.Specialized;如果编译的时候出错,请添加相关引用。修改文件如下图:3usingSystem;usirigSystem.10;heingSystern.DirectoryServices;nisingSystem.Re£1ec+ion;usirigSystem.Data;iisingSystem.Data.SqlClient;iisingSystem.Contion.工nstall;iieingSystem.M:=irL:=Lgement;□il:=iitiespaceSetupClassLibr:arypartial/////////privatepartial/////////privateSyst'■■:/sujrimary)em.CDn-ipurierLtMudel.ICuntairLHi-^omponerLtE=mill:润牛设计器生成的代玛注意要手动添加Installer!将DBSQL.txt文件放到此项目中,在属性中设置为“嵌入的资源”曰高蟾复制到输出目录不复制[生成操作嵌入的资源3自定义工具无自定yxa命名空间编译,:杂攻内容完整路役嵌双的资源'安件名DBbyL.txt回到MyWebSetup项目,点击查看属性,可以设置安装文件到显示相关信息,如图

屋性MyWebSetup部署项目属性E41S♦基XT或泰项.]AddRemoveProgramsIcon咒无)Author戒蜃司名称DescriptionDetectNewerlnstalledVersionTrueInstallAllUser^FalseKeywordsLocalization:Chinese(Simplified)/Manufacturer券愁司名称ManufacturerUrlPostBuildEventPreBuiidEventProductcodep{C8E0A538^D40-4AB9-A2AB^A58F:2'17DD2B}ProductNameMyV?eb5etupRemovePre^ibusVersionsFalseRunPostBuildEvent成功生成时5earchPathSubjectSupportPhoneSupportUrlTargetPlatform舞&TitleMyWeb5etupUpgradeCode{12A4703E-4C06-4FCE-865E-F8CA695E04A5}Version1.0.0选择文件系统,如图:然后:

(在文件系统中,在属性里面可以设置安装程序默认到安装路径)添加一个叫bin文件夹并添加在生成网站时bin目录下的dll文件,如图:自定敏操作(MyWebSetup).(MyWebSetup)'WebvconfigMylnstaller.Designer.c.s.起始页>目标计算机上的文件系统

雷L3应用程序文件夹'.•bin福加文件L,>目标计算机上的文件系统

雷L3应用程序文件夹'.•bin福加文件L,,,查找范围血|匚bin月|康▼口名称类型占叩_Web_-4n7yYw8.dll;桌面我的项目我的电蔺文件名(山:在应用程序文件夹下在生成网站时目录下的文件,添加后如图:自定义操作(MyWeb5etup).文(MyWebSetup)Web.configMyInstaller.Designer.es目标计算机上的文件系统应用程序文件夹国bin以目标计算机上的文件系统应用程序文件夹国bin以用户的霍序瞧单以用户臭面名称ILibin司ClientCallback.aspK筒PrecompiledApp.config^Web.config贰主输出来自泡upClm/Librmr?(活动}'类查立祥夹文件文件文件输出选择“用户界面编辑器”,添加两个文本框A和B,A将作为安装新站点后的IIS设置,B将作为数据库操作时的参数设置,调整位置后如下:Setup安装完成Setup安装完成已成功安装'泓tup□单击“关闭”退出。话使用WindowsUpdate检查是否有重要的.HETFramework更新口取消<上一步侣)关闭g调整A的属性,这里只选择了显示两个输入框,属性分别为IISSERVER和PORT,值为localhost和取消<上一步侣)关闭g屋性W早X文本框(A)用户界面对话疱屈性■匮1金1..■日杂顶BannerBitmap丫默认值)BannerTex^BannerTextBodyText输犬新网站的设置EditlLabel服茶器EditlPropertyII55ERVEREditlValuelocalhostEdit1VisibleTrueEditZLabel端口Edit^PropertyPORTEdit2Value9998Edit^isibleTrueEditSLabelEdit3;Edit3Propert^-EDIT明Edit3ValueEditSVisibleFalseEdit4LabelEdit4:Edit4PropertyEDITA4Edit4ValueEdit4VisibleFalse1文本框B的设置如下:属性▼基X文本挺(S)用户界面对话柩雇性»■S杂项BannerBitmap默认值)BannerText-BannerTextBodyText数据库设置EditlLabel数据库服务器EditlPr叩ertyDB5ERVERNAMEEditlvaluelocalEdit1VisibleTrueEdit2Label数据库名称Edit2PropertyDBNAMEEdit2ValueFutureEdit2VfcibleTrueEdit3Label登录账号Edit3PropertyU5ERNAMEEditS/alueEdib3V'isibleTrueEdit4Label登录密码Edit4Property-'PASSWORDEdit4ValueEdit4VrsibleTrueOK,文本框设置完毕。当然,你还可以选择其他的多种文本框,如协议什么的。

打开自定义操作面板:自定受操作(MyWebSetup)用户界:^ly^ebSetup)曰提*添加自定爻操作(由…g对然后:自定曳操作(MyWebSetupj-鬲自愚s作♦LL安^■a然后:自定曳操作(MyWebSetupj-鬲自愚s作♦LL安^■a主输出来自宠tupCls浴Library(活的}属性主输出来自SetupCiasfLj提交'回摩',卸载10Lj提交'回摩',卸载EntryPointInstallet^las§/SourcePath在CustomActionData中输入:/dbname=[DBNAME]/server=[DBSERVERNAME]/user=[USERNAME]/pwd=[PASSWORD]/iis=[IISSERVER]/port=[PORT]/targetdir="[TARGETDIR]\"这些参数就是文本框A和B上的输入框的值,在安装过程中可以获得,然后进行处理。至此,基本的安装文件已经制作完毕。进行生成,然后点击安装,可以看到文件已经复制到了相应到目录。接下来就要接收参数对IIS和数据库进行处理。打开SetupClassLibrary项目下的MyInstaller.Designer.cs,修改此文件。申明几个变量:privateSystem.Data.SqlClient.SqlConnectionsqlConn;privateSystem.Data.SqlClient.SqlCommandCommand;privatestringDBName;privatestringServerName;privatestringAdminName;privatestringAdminPwd;privatestringiis;privatestringport;privatestringdir;publicstaticstringVirDirSchemaName="IIsWebVirtualDir”;privatestring_target;privateDirectoryEntry_iisServer;privateManagementScope_scope;privateConnectionOptions_connection;连接数据库服务器到方法:#regionConnectDatabase连接数据库privateboolConnectDatabase(){if(Command.Connection.State!=ConnectionState.Open){try{Command.Connection.Open();}catch(Exceptione){returnfalse;}}returntrue;}#endregion如果不能正确连接数据库服务器,请检查你的连接字符串,或者将连接字符串写入文件查看。不好意思,我不知道如何对这种安装部署程序进行debug,sorry咯!读取SQL文件的方法:#regionGetSql从文件中读取SQL,在读取包含SQL脚本的文件时需要用到,参考自MSDNprivatestringGetSql(stringName){try{AssemblyAsm=Assembly.GetExecutingAssembly();Streamstrm=Asm.GetManifestResourceStream(Asm.GetName().Name+"."+Name);StreamReaderreader=newStreamReader(strm);returnreader.ReadToEnd();}catch(ExceptiongetException){thrownewApplicationException(getException.Message);}}#endregion可以将此需要执行的SQL脚本放在此文本中执行SQL语句的方法:#regionExecuteSql执行SQL语句,参考自MSDNprivatevoidExecuteSql(stringDataBaseName,stringsqlstring){Command=newSystem.Data.SqlClient.SqlCommand(sqlstring,sqlConn);if(ConnectDatabase()){try{Command.Connection.ChangeDatabase(DataBaseName);Command.ExecuteNonQuery();}finally{Command.Connection.Close();}}}#endregion创建数据库及数据库表:#regionCreateDBAndTable创建数据库及数据库表,参考自MSDNprotectedboolCreateDBAndTable(stringDBName)boolRestult=false;try{ExecuteSql("master”,"USEMASTERIFEXISTS(SELECTNAMEFROMSYSDATABASESWHERENAME='"+DBName+"')DROPDATABASE"+DBName);ExecuteSql("master","CREATEDATABASE"+DBName);ExecuteSql(DBName,GetSql("DBSQL.txt"));Restult=true;}Catch{}returnRestult;}#endregion从备份文件恢复数据库及数据库表#regionRestoreDB从备份文件恢复数据库及数据库表//////从备份文件恢复数据库及数据库表//////数据库名///配件中数据库脚本资源的名称///protectedboolRestoreDB(stringDBName){dir=this.Context.Parameters["targetdir"];boolRestult=false;stringMSQL="RESTOREDATABASE"+DBName+"FROMDISK='"+dir+@"data.bak'"+"WITHMOVE'Test'TO'"+@"c:\"+DBName+".mdf',"+"MOVE'Test_log'TO'"+@"c:\"+DBName+".ldf";try{ExecuteSql("master","USEMASTERIFEXISTS(SELECTNAMEFROMSYSDATABASESWHERENAME='"+DBName+"')DROPDATABASE"+DBName);ExecuteSql("master",MSQL);Restult=true;}finally{//删除备份文件try{File.Delete(dir+@"data.bak");}catch{}}returnRestult;}#endregion这里可以到注册表读取SQLServer的安装路径,把恢复后的数据库文件放到data目录地下。在本例中,只是实现了恢复,并未进行标准的操作。其中Test和Test_log时备份时数据库的文件信息。如果想要从备份文件中恢复,请把文件包含到项目里并且设置和DBSQL.txt一样,嵌入到程序里。最后执行删除。不过我想应该有办法不把文件先安装到目标机器上,而是有方法想读取DBSQL.txt文件一样,直接恢复数据库,不过确实没想到办法,失败!网站安装好后,需要设置web.config文件,这里只涉及到连接字符串到设置,其他的可以同理修改。从备份文件恢复数据库及数据库表#regionWriteWebConfig修改web.config的连接数据库的字符串privateboolWriteWebConfig。{System.IO.FileInfoFileInfo=newSystem.IO.FileInfo(this.Context.Parameters["targetdir"]+"/web.config");if(!FileInfo.Exists){thrownewInstallException("Missingconfigfile:"+this.Context.Parameters["targetdir"]+"/web.config");}System.Xml.XmlDocumentxmlDocument=newSystem.Xml.XmlDocument();xmlDocument.Load(FileInfo.FullName);boolFoundIt=false;foreach(System.Xml.XmlNodeNodeinxmlDocument["configuration"]["appSettings"]){if(Node.Name=="add"){if(Node.Attributes.GetNamedItem("key").Value=="ConnectionString")Node.Attributes.GetNamedItem("value").Value=String.Format("PersistSecurityInfo=False;DataSource={0};database={1};UserID={2};Password={3};PacketSize=4096;Pooling=true;MaxPoolSize=100;MinPoolSize=1",ServerName,DBName,AdminName,AdminPwd);FoundIt=true;}}}if(!FoundIt){thrownewInstallException("Errorwhenwritingtheconfigfile:web.config");}xmlDocument.Save(FileInfo.FullName);returnFoundIt;}#endregion从备份文件恢复数据库及数据库表#regionWriteRegistryKey写注册表。安装部署中,直接有一个注册表编辑器,可以在那里面设置。privatevoidWriteRegistryKey(){//写注册表RegistryKeyhklm=Registry.LocalMachine;RegistryKeycqfeng=hklm.OpenSubKey("SOFTWARE”,true);RegistryKeyF=cqfeng.CreateSubKey("cqfeng");F.SetValue("FilePath”,"kkkk");}#endregion操作IIS,建立网站等。可参考:用VS2005制作网页对IIS进行操作#regionConnect连接IIS服务器publicboolConnect(){if(iis==null)returnfalse;try{_iisServer=newDirectoryEntry("IIS://"+iis+"/W3SVC/1”);_target=iis;_connection=newConnectionOptions();_scope=newManagementScope(@"\\"+iis+@"\root\MicrosoftIISV2",_connection);_scope.Connect();}catch{returnfalse;}returnIsConnected();}publicboolIsConnected(){if(_target==null||_connection==null||_scope==null)returnfalse;return_scope.IsConnected;}#endregion#regionIsWebSiteExists判断网站是否已经存在publicboolIsWebSiteExists(stringserverID){try{stringsiteName="W3SVC/"+serverID;ManagementObjectSearchersearcher=newManagementObjectSearcher(_scope,newObjectQuery("SELECT*FROMIIsWebServer"),null);ManagementObjectCollectionwebSites=searcher.Get();foreach(ManagementObjectwebSiteinwebSites){if((string)webSite.Properties["Name"].Value==siteName)returntrue;}returnfalse;}catch{returnfalse;}}#endregion#regionGetNextOpenlD获得一个新的ServerlDprivateintGetNextOpenID(){DirectoryEntryiisComputer=newDirectoryEntry("IIS://localhost/w3svc");intnextID=0;foreach(DirectoryEntryiisWebServeriniisComputer.Children){stringsname=iisWebServer.Name;try{intname=int.Parse(sname);if(name>nextID){nextID=name;}}catch{}}return++nextID;}#endregion#regionCreateWebsite添加网站publicstringCreateWebSite(stringserverID,stringserverComment,stringdefaultVrootPath,stringHostName,stringIP,stringPort){try{ManagementobjectoW3SVC=newManagementObject(_scope,newManagementPath(@"IIsWebService='W3SVC'"),null);if(IsWebSiteExists(serverID)){return"SiteAlreadyExists...";}ManagementBaseObjectinputParameters=oW3SVC.GetMethodParameters("CreateNewSite");ManagementBaseObject[]serverBinding=newManagementBaseObject[1];serverBinding[0]=CreateServerBinding(HostName,IP,Port);inputParameters["ServerComment"]=serverComment;inputParameters["ServerBindings"]=serverBinding;inputParameters["PathOfRootVirtualDir"]=defaultVrootPath;inputParameters["ServerId"]=serverID;ManagementBaseObjectoutParameter=null;outParameter=oW3SVC.InvokeMethod("CreateNewSite",inputParameters,null);//启动网站stringserverName="W3SVC/"+serverID;ManagementObjectwebSite=newManagementObject(_scope,newManagementPath(@"IIsWebServer='"+serverName+"'"),null);webSite.InvokeMethod("Start",null);return(string)outParameter.Properties["ReturnValue"].Value;}catch(Exceptionex){returnex.Message;}}publicManagementObjectCreateServerBinding(stringHostName,stringIP,stringPort){try{ManagementClassclassBinding=newManagementClass(_scope,newManagementPath("ServerBinding"),null);ManagementObjectserverBinding=classBinding.CreateInstance();serverBinding.Properties["Hostname"].Value=HostName;serverBinding.Properties["IP"].Value=IP;serverBinding.Properties["Port"].Value=Port;serverBinding.Put();returnserverBinding;}catch{returnnull;}}#endregion好了,准备工作已经做完,现在开始写最重要的Install方法了整个方法写完后如下:#regionInstall安装//////安装数据库///IllpublicoverridevoidInstall(IDictionarystateSaver){base.Install(stateSaver);dir=this.Context.Parameters["dir”];DBName=this.Context.Parameters["DBNAME"].ToString();ServerName=this.Context.Parameters["server"].ToString();AdminName=this.Context.Parameters["user"].ToString();AdminPwd=this.Context.Parameters["pwd"].ToString();iis=this.Context.Parameters["iis"].ToString();;port=this.Context.Parameters["port"].ToString();〃写入获取的安装程序中的变量,此段代码为调试用可以不添加this.sqlConn.ConnectionString="Packetsize=4096;UserID="+AdminName+";DataSource="+ServerName+";Password="+AdminPwd+";PersistSecurityInfo=False;IntegratedSecurity=false";II执行SQL安装数据库可选择时恢复或者时直接创建if(!CreateDBAndTable(DBName)){thrownewApplicationException("创建数据库时出现严重错误!”);}II从备份数据库文件恢复数据库I*if(!RestoreDB(DBName)){thrownewApplicationException("恢复数据库时出现严重错误!");}*III添加网站Connect();IIstringserverID=GetNextOpenID().ToString();IIstringserverComment=websitenName;II下面的信息为测试,可以自己编写文本框来接收用户输入信息stringserverID="5555";stringserverComment="cqfeng";stringdefaultVrootPath=this.Context.Parameters["targetdir"];if(defaultVrootPath.EndsWith(@"\")){defaultVrootPath=defaultVrootPath.Substring(0,defaultVrootPath.Length-1);}stringHostName="”;stringIP="”;stringPort=port;stringsReturn=CreateWebSite(serverID,serverComment,defaultVrootPath,HostName,IP,Port);//修改web.configif(!WriteWe

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论