vs2008打包web程序,并建立数据库建立快捷方式--小结

vs打包并创建数据的例子网上很多,而且有一个版本的居多,但是这个版本的有个地方的初始化代码漏写了,导致出错。可惜vs的打包项目不能调试,所以让好多人叫苦不堪。这里做的简单整理如下。 

涉及到到内容包括:使用安装部署工具,建立数据库,配置IIS,文件操作,web.config,注册表等。参考了网上关于使用VS制作安装程序的文章。环境:WindowsXP+ VS2008+ SQL2005。

使用VS2005制作安装程序的时候,有多种选择,如下图:

我想一般常用的可能就最上面的两种。当使用Web安装项目时,执行制作好的msi安装文件时,会发现实际上是添加虚拟目录而不是添加网站,而且无法选择安装目录,但是这里的这种方式能够满足需求,所以采用此模式。本篇文章用的是使用“Web安装项目”,把Web文件部署到目标机器上,然后重写install方法,配置IIS,执行SQL脚本,修改web.config文件等。

在开始整个过程之前,需要先了解一下“预编译”的概念,MSDN上的说明是:默认情况下,在用户首次请求资源(如网站的一个页)时,将动态编译 ASP.NET 网页和代码文件。第一次编译页和代码文件之后,会缓存编译后的资源,这样将大大提高随后对同一页提出的请求的效率。请查阅MSDN“预编译”相关文档。 

准备一个文件DBSQL.sql,在里面包含连接数据库后需要执行的SQL脚本,在本例中使用了简单的一个Create Tabel的SQL。

 一、建立网站

打开VS2005,打开一个网站项目,这里是打开的本地localhost,如图:

新加一个页面,随便取个名字(本文中为ClientCallback.aspx),然后写一个简单的按钮事件即可,这不是本文的重点,由你随意处理^_^ 再添加web配置文件即web.config,在下添加             

此文件到时候是需要发布到目标机器上的。(关于连接数据库字符串,VS2005里面有专门的connectionStrings,本文未使用,可查阅帮助)

点击生成网站,访问页面,ok

选择菜单生成=》发布网站:

点击确定后,网站已经生成,这些就是需要部署到目标机器上的所有文件。

 

点击确定后,网站已经生成,这些就是需要部署到目标机器上的所有文件。

 

二、建立安装部署项目

点击菜单文件=》添加=》新建项目,添加安装部署项目,如图:

 

 三、添加安装类库项目

添加安装项目类库:

删除默认的Class1.cs,在该安装项目上右键—>添加—>新建项—> 安装程序类,输入InstallerDb。

四、重写instal

修改文件如下:

 

 

ExpandedBlockStart.gif 代码
  1  using  System;
  2  using  System.Collections;
  3  using  System.ComponentModel;
  4  using  System.Configuration.Install;
  5  using  System.Data;
  6  using  System.Data.SqlClient;
  7  using  System.DirectoryServices;
  8  using  System.IO;
  9  using  System.Management;
 10  using  System.Reflection;
 11  using  System.Runtime.InteropServices;
 12  using  System.Windows.Forms;
 13  using  System.Xml;
 14  using  IWshRuntimeLibrary;
 15  using  Microsoft.Win32;
 16  using  File  =  System.IO.File;
 17 
 18  namespace  InstallerCL
 19  {
 20      [RunInstaller( true )]
 21       public   partial   class  InstallerDb : Installer
 22      {
 23           #region  Property
 24 
 25           private  SqlConnection _sqlConn;
 26           private  SqlCommand _command;
 27           ///   <summary>
 28           ///  数据库名称
 29           ///   </summary>
 30           private   string  _dbName;
 31           ///   <summary>
 32           ///  数据库服务器
 33           ///   </summary>
 34           private   string  _serverName;
 35           ///   <summary>
 36           ///  数据库用户
 37           ///   </summary>
 38           private   string  _adminName;
 39           ///   <summary>
 40           ///  数据库密码
 41           ///   </summary>
 42           private   string  _adminPwd;
 43 
 44           private   string  _iis;
 45           private   string  _port;
 46           private   string  _dir;
 47           public   static   string  VirDirSchemaName  =   " IIsWebVirtualDir " ;
 48 
 49           private   string  _target;
 50           private  DirectoryEntry _iisServer;
 51           private  ManagementScope _scope;
 52           private  ConnectionOptions _connection;
 53 
 54           ///   <summary>
 55           ///  连接字符串名称
 56           ///   </summary>
 57           private   string  _conStringName;
 58           ///   <summary>
 59           ///  自定义连接字符串名称
 60           ///   </summary>
 61           private   string  _customConStringName;
 62           ///   <summary>
 63           ///  master连接字符串名称
 64           ///   </summary>
 65           private   string  _masterConStringName;
 66 
 67           ///   <summary>
 68           ///  存储sql脚本的文件名称
 69           ///   </summary>
 70           private   string  _sqlTextFileName;
 71           ///   <summary>
 72           ///  项目名称,创建桌面快捷方式时的名称
 73           ///   </summary>
 74           private   string  _prajectName;
 75 
 76           private   const   string  DatabaseMaster  =   " master " ;
 77 
 78           #endregion
 79 
 80           #region  Constructor
 81           public  InstallerDb()
 82          {
 83              InitializeComponent();
 84          }
 85           #endregion
 86 
 87           #region  Init 读取安装程序传递的参数变量,并初始化相应的编程环境变量
 88 
 89           ///   <summary>
 90           ///  读取安装程序传递的参数变量,并初始化相应的编程环境变量
 91           ///   </summary>
 92           private   void  Init()
 93          {
 94              _dir  =   this .Context.Parameters[ " targetdir " ];
 95              _dbName  =   this .Context.Parameters[ " DBNAME " ];
 96              _serverName  =   this .Context.Parameters[ " server " ];
 97              _adminName  =   this .Context.Parameters[ " user " ];
 98              _adminPwd  =   this .Context.Parameters[ " pwd " ];
 99              _iis  =   this .Context.Parameters[ " iis " ];
100              _port  =   this .Context.Parameters[ " port " ];
101 
102              _conStringName  =   this .Context.Parameters[ " conStringName " ]; //  "conn";
103              _customConStringName  =   this .Context.Parameters[ " customConStringName " ]; //  "bdmConnectionString";
104              _masterConStringName  =   this .Context.Parameters[ " masterConStringName " ]; //  "masterConnectionString";
105              _sqlTextFileName  =   this .Context.Parameters[ " sqlTextFileName " ]; //  "HiisBdm.sql";
106              _prajectName  =   this .Context.Parameters[ " proName " ];
107          }
108 
109           #endregion
110 
111           #region  ConnectDatabase 连接数据库
112 
113           ///   <summary>
114           ///  打开数据库服务器连接
115           ///   </summary>
116           ///   <returns></returns>
117           private   bool  ConnectDatabase()
118          {
119               if  (_command.Connection.State  !=  ConnectionState.Open)
120              {
121                   try
122                  {
123                      _command.Connection.Open();
124                  }
125                   catch  (Exception e)
126                  {
127                      MessageBox.Show(e.Message  +  e.StackTrace);
128                       return   false ;
129                  }
130              }
131               return   true ;
132          }
133           #endregion
134 
135           #region  GetSql 读取包含SQL脚本的文件
136 
137           ///   <summary>
138           ///  读取SQL脚本文件
139           ///   </summary>
140           ///   <param name="Name"> 文件名称 </param>
141           ///   <returns></returns>
142           private   string  GetSql( string  Name)
143          {
144               try
145              {
146                  Assembly asm  =  Assembly.GetExecutingAssembly();
147                  Stream strm  =  asm.GetManifestResourceStream(asm.GetName().Name  +   " . "   +  Name);
148                  StreamReader reader  =   new  StreamReader(strm);
149                   return  reader.ReadToEnd();
150              }
151               catch  (Exception getException)
152              {
153                   throw   new  ApplicationException(getException.Message);
154              }
155          }
156           #endregion
157 
158           #region  ExecuteSql 执行SQL语句
159 
160           ///   <summary>
161           ///  执行SQL语句
162           ///   </summary>
163           ///   <param name="dataBaseName"> 执行sql的数据库名称 </param>
164           ///   <param name="sqlstring"> sql脚本 </param>
165           private   void  ExecuteSql( string  dataBaseName,  string  sqlstring)
166          {
167              _command  =   new  SqlCommand(sqlstring, _sqlConn);
168               if  (ConnectDatabase())
169              {
170                   try
171                  {
172                      _command.Connection.ChangeDatabase(dataBaseName);
173                      _command.ExecuteNonQuery();
174                  }
175                   finally
176                  {
177                      _command.Connection.Close();
178                  }
179              }
180          }
181           #endregion
182 
183           #region   ExistDataBase  检查数据库是否存在
184           ///   <summary>
185           ///  检查数据库是否存在
186           ///   </summary>
187           ///   <param name="dbName"></param>
188           ///   <returns></returns>
189           private   bool  ExistDataBase( string  dbName)
190          {
191              _command  =   new  SqlCommand( string .Format( " SELECT NAME FROM SYSDATABASES WHERE NAME ='{0}' " , dbName), _sqlConn);
192               if  (ConnectDatabase())
193              {
194                   try
195                  {
196                      _command.Connection.ChangeDatabase(DatabaseMaster);
197                       return  _command.ExecuteScalar()  !=   null ;
198                  }
199                   catch  (Exception)
200                  {
201                       return   false ;
202                  }
203                   finally
204                  {
205                      _command.Connection.Close();
206                  }
207              }
208               return   false ;
209          }
210           #endregion
211 
212           #region  CreateDBAndTable 创建数据库及数据库表
213 
214           ///   <summary>
215           ///  创建数据库及数据库表
216           ///   </summary>
217           ///   <param name="dbName"> 数据库名称 </param>
218           ///   <returns></returns>
219           protected   bool  CreateDbAndTable( string  dbName)
220          {
221               try
222              {
223                   // ExecuteSql("master", "USE MASTER IF EXISTS (SELECT NAME FROM SYSDATABASES WHERE NAME='" + dbName + "') DROP DATABASE " + dbName);
224                   /* **
225                   * 安装之前先删除数据库; sql 2005 脚本
226                  ExecuteSql(DatabaseMaster,string.Format(@"EXEC msdb.dbo.sp_delete_database_backuphistory @database_name = N'{1}'                                            
227                                                          USE {0}                                            
228                                                          ALTER DATABASE {1} SET  SINGLE_USER WITH ROLLBACK IMMEDIATE                                            
229                                                          USE {0}                                            
230                                                          DROP DATABASE {1}", DatabaseMaster, dbName));
231                   * * */
232                  ExecuteSql(DatabaseMaster,  " CREATE DATABASE  "   +  dbName);
233                  ExecuteSql(dbName, GetSql(_sqlTextFileName));
234              }
235               catch  (Exception)
236              {
237                   throw   new  Exception( " 创建数据库异常 " );
238              }
239               return   true ;
240          }
241 
242           #endregion
243           // ?
244           #region  RestoreDB 从备份文件恢复数据库及数据库表
245 
246           ///   <summary>
247           ///  从备份文件恢复数据库及数据库表
248           ///   </summary>
249           ///   <param name="DBName"> 数据库名 </param>
250           ///   <returns></returns>
251           protected   bool  RestoreDB( string  DBName)
252          {
253              _dir  =   this .Context.Parameters[ " targetdir " ];
254               bool  Restult  =   false ;
255               string  MSQL  =   " RESTORE DATABASE  "   +  DBName  +
256                   "  FROM DISK = ' "   +  _dir  +   @" data.bak'  "   +
257                   "  WITH MOVE 'Test' TO ' "   +   @" c:\ "   +  DBName  +   " .mdf',  "   +
258                   "  MOVE 'Test_log' TO ' "   +   @" c:\ "   +  DBName  +   " .ldf'  " ;
259               try
260              {
261                  ExecuteSql( " master " " USE MASTER IF EXISTS (SELECT NAME FROM SYSDATABASES WHERE NAME=' "   +  DBName  +   " ') DROP DATABASE  "   +  DBName);
262                  ExecuteSql( " master " , MSQL);
263                  Restult  =   true ;
264              }
265               finally
266              {
267                   //  删除备份文件
268                   try
269                  {
270                      File.Delete(_dir  +   @" data.bak " );
271                  }
272                   catch
273                  {
274 
275                  }
276              }
277               return  Restult;
278          }
279           #endregion
280 
281           #region  WriteWebConfig 修改web.config的连接数据库的字符串
282 
283           ///   <summary>
284           ///  修改web.config的连接数据库的字符串
285           ///   </summary>
286           ///   <param name="connectionName"> 连接字符串名称 </param>
287           ///   <returns></returns>
288           private   bool  WriteWebConfig( string  connectionName)
289          {
290              FileInfo fileInfo  =   new  FileInfo(_dir  +   " /web.config " );
291               if  ( ! fileInfo.Exists)
292              {
293                   throw   new  InstallException( " Missing config file : "   +  _dir  +   " /web.config " );
294              }
295              XmlDocument xmlDocument  =   new  XmlDocument();
296              xmlDocument.Load(fileInfo.FullName);
297 
298               bool  foundIt  =   false ;
299               foreach  (XmlNode Node  in  xmlDocument[ " configuration " ][ " connectionStrings " ])
300              {
301                   if  (Node.Name  ==   " add " )
302                  {
303                       if  (Node.Attributes.GetNamedItem( " name " ).Value  ==  connectionName)
304                      {
305                          Node.Attributes.GetNamedItem( " connectionString " ).Value  =  String.Format( " Persist Security Info=False;Data Source={0};database={1};User ID={2};Password={3};Packet Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1 " , _serverName, _dbName, _adminName, _adminPwd);
306                          foundIt  =   true ;
307                      }
308                  }
309              }
310               if  ( ! foundIt)
311              {
312                   throw   new  InstallException( " Error when writing the config file: web.config " );
313              }
314              xmlDocument.Save(fileInfo.FullName);
315               return  foundIt;
316          }
317           #endregion
318 
319           #region  WriteRegistryKey 写注册表
320 
321           private   void  WriteRegistryKey()
322          {
323              RegistryKey hklm  =  Registry.LocalMachine;
324              RegistryKey software  =  hklm.OpenSubKey( " SOFTWARE " true );
325 
326              RegistryKey company  =  software.CreateSubKey( " DeepinSoft " );
327 
328              company.SetValue( " FilePath " , _dir);
329              company.SetValue( " CompanyName " " 日照深度软件有限公司 " );
330              company.SetValue( " WebSite " " http://www.deepinsoft.com/ " );
331              company.SetValue( " Tel " " 0633-2190588  2190589 " );
332          }
333           #endregion
334           // ?
335           #region  Connect 连接IIS服务器
336 
337           public   bool  Connect()
338          {
339               if  (_iis  ==   null )
340                   return   false ;
341               try
342              {
343                  _iisServer  =   new  DirectoryEntry( " IIS:// "   +  _iis  +   " /W3SVC/1 " );
344                  _target  =  _iis;
345                  _connection  =   new  ConnectionOptions();
346                  _scope  =   new  ManagementScope( @" \\ "   +  _iis  +   @" \root\MicrosoftIISV2 " , _connection);
347                  _scope.Connect();
348              }
349               catch
350              {
351                   return   false ;
352              }
353               return  IsConnected();
354          }
355 
356           public   bool  IsConnected()
357          {
358               if  (_target  ==   null   ||  _connection  ==   null   ||  _scope  ==   null return   false ;
359               return  _scope.IsConnected;
360          }
361           #endregion
362           // ?
363           #region  IsWebSiteExists 判断网站是否已经存在
364 
365           public   bool  IsWebSiteExists( string  serverID)
366          {
367               try
368              {
369                   string  siteName  =   " W3SVC/ "   +  serverID;
370                  ManagementObjectSearcher searcher  =   new  ManagementObjectSearcher(_scope,  new  ObjectQuery( " SELECT * FROM IIsWebServer " ),  null );
371 
372                  ManagementObjectCollection webSites  =  searcher.Get();
373                   foreach  (ManagementObject webSite  in  webSites)
374                  {
375                       if  (( string )webSite.Properties[ " Name " ].Value  ==  siteName)
376                           return   true ;
377                  }
378                   return   false ;
379              }
380               catch
381              {
382                   return   false ;
383              }
384          }
385 
386           #endregion
387           // ?
388           #region  GetNextOpenID 获得一个新的ServerID
389 
390           private   int  GetNextOpenID()
391          {
392              DirectoryEntry iisComputer  =   new  DirectoryEntry( " IIS://localhost/w3svc " );
393               int  nextID  =   0 ;
394               foreach  (DirectoryEntry iisWebServer  in  iisComputer.Children)
395              {
396                   string  sname  =  iisWebServer.Name;
397                   try
398                  {
399                       int  name  =   int .Parse(sname);
400                       if  (name  >  nextID)
401                      {
402                          nextID  =  name;
403                      }
404                  }
405                   catch
406                  {
407 
408                  }
409              }
410               return   ++ nextID;
411          }
412           #endregion
413           // ?
414           #region  CreateWebsite 添加网站
415 
416           public   string  CreateWebSite( string  serverID,  string  serverComment,  string  defaultVrootPath,  string  HostName,  string  IP,  string  Port)
417          {
418               try
419              {
420                  ManagementObject oW3SVC  =   new  ManagementObject(_scope,  new  ManagementPath( @" IIsWebService='W3SVC' " ),  null );
421 
422                   if  (IsWebSiteExists(serverID))
423                  {
424                       return   " Site Already Exists... " ;
425                  }
426 
427                  ManagementBaseObject inputParameters  =  oW3SVC.GetMethodParameters( " CreateNewSite " );
428                  ManagementBaseObject[] serverBinding  =   new  ManagementBaseObject[ 1 ];
429                  serverBinding[ 0 =  CreateServerBinding(HostName, IP, Port);
430                  inputParameters[ " ServerComment " =  serverComment;
431                  inputParameters[ " ServerBindings " =  serverBinding;
432                  inputParameters[ " PathOfRootVirtualDir " =  defaultVrootPath;
433                  inputParameters[ " ServerId " =  serverID;
434 
435                  ManagementBaseObject outParameter  =   null ;
436                  outParameter  =  oW3SVC.InvokeMethod( " CreateNewSite " , inputParameters,  null );
437 
438                   //  启动网站
439                   string  serverName  =   " W3SVC/ "   +  serverID;
440                  ManagementObject webSite  =   new  ManagementObject(_scope,  new  ManagementPath( @" IIsWebServer=' "   +  serverName  +   " ' " ),  null );
441                  webSite.InvokeMethod( " Start " null );
442 
443                   return  ( string )outParameter.Properties[ " ReturnValue " ].Value;
444              }
445               catch  (Exception ex)
446              {
447                   return  ex.Message;
448              }
449          }
450 
451           public  ManagementObject CreateServerBinding( string  HostName,  string  IP,  string  Port)
452          {
453               try
454              {
455                  ManagementClass classBinding  =   new  ManagementClass(_scope,  new  ManagementPath( " ServerBinding " ),  null );
456                  ManagementObject serverBinding  =  classBinding.CreateInstance();
457                  serverBinding.Properties[ " Hostname " ].Value  =  HostName;
458                  serverBinding.Properties[ " IP " ].Value  =  IP;
459                  serverBinding.Properties[ " Port " ].Value  =  Port;
460                  serverBinding.Put();
461                   return  serverBinding;
462              }
463               catch
464              {
465                   return   null ;
466              }
467          }
468 
469           #endregion
470 
471           #region  创建快捷方式
472           ///   <summary>
473           ///  创建快捷方式
474           ///   </summary>
475           private   void  CreateShortCuts()
476          {
477               try
478              {
479                  var temdir  =  _dir;
480                   if  (temdir.LastIndexOf( " \\ " +   1   ==  temdir.Length)
481                      temdir  =  temdir.Substring( 0 , temdir.Length  -   1 );
482                  var s  =  temdir.Split( ' \\ ' );
483                   string  siteUrl  =   string .Format( " http://localhost/%7B0} " , s[s.Length  -   1 ]);
484 
485                  var sysFolderManage  =   new  SysFolderManager();
486                   // 在桌面上创建快捷方式
487                  WshShellClass shell  =   new  WshShellClass();
488                  IWshShortcut shortcut  =  (IWshShortcut)shell.CreateShortcut(sysFolderManage.GetFolder(EnSysFolderType.Desktop)  +   string .Format( " http://www.cnblogs.com/diaoluodexue/admin/file://%7b0%7d.lnk/ " , _prajectName));
489                   // shortcut.TargetPath = @"%HOMEDRIVE%\Program Files\Internet Explorer\IEXPLORE.EXE";
490                  shortcut.TargetPath  =   @" %ProgramFiles%\Internet Explorer\IEXPLORE.EXE " ;
491                  shortcut.Arguments  =  siteUrl; //  参数 
492                  shortcut.Description  =   string .Format( " {0} 0633-2190588 " , _prajectName);
493                  shortcut.WorkingDirectory  =  Application.StartupPath; // 程序所在文件夹,在快捷方式图标点击右键可以看到此属性 
494                  shortcut.IconLocation  =  _dir  +   " http://www.cnblogs.com/diaoluodexue/admin/file://hiisbdm.ico%22;//图标 
495                  shortcut.Hotkey  =   " CTRL+SHIFT+B " ; // 热键 
496                  shortcut.WindowStyle  =   1 ;
497                  shortcut.Save();
498                   // 添加到收藏夹中
499                  IWshShortcut shortcutF  =  (IWshShortcut)shell.CreateShortcut(sysFolderManage.GetFolder(EnSysFolderType.Favorites)  +   string .Format( " http://www.cnblogs.com/diaoluodexue/admin/file://%7b0%7d.lnk/ " , _prajectName));
500                   // shortcutF.TargetPath = @"%HOMEDRIVE%/Program Files\Internet Explorer\IEXPLORE.EXE";
501                  shortcutF.TargetPath  =   @" %ProgramFiles%\Internet Explorer\IEXPLORE.EXE " ;
502                  shortcutF.Arguments  =  siteUrl; //  参数 
503                  shortcutF.Description  =   string .Format( " {0} 0633-2190588 " , _prajectName);
504                  shortcutF.WorkingDirectory  =  Application.StartupPath; // 程序所在文件夹,在快捷方式图标点击右键可以看到此属性 
505                  shortcutF.IconLocation  =  _dir  +   " http://www.cnblogs.com/diaoluodexue/admin/file://hiisbdm.ico%22;//图标 
506                  shortcutF.Hotkey  =   " CTRL+SHIFT+B " ; // 热键 
507                  shortcutF.WindowStyle  =   1 ;
508                  shortcutF.Save();
509              }
510               catch  (COMException ex)
511              {
512                  MessageBox.Show( " 创建快捷方式失败!\r\n "   +  ex.Message);
513              }
514          }
515 
516           #endregion
517 
518           #region  Install 安装
519 
520           ///   <summary>
521           ///  系统安装
522           ///   </summary>
523           ///   <param name="stateSaver"></param>
524           public   override   void  Install(IDictionary stateSaver)
525          {
526               base .Install(stateSaver);
527              Init();
528 
529               // 创建数据库连接)
530               if  ( this ._sqlConn  ==   null )
531              {
532                   this ._sqlConn  =   new  SqlConnection();
533              }
534               this ._sqlConn.ConnectionString  =   " User ID= "   +  _adminName  +   " ;Server= "   +  _serverName  +   " ;Password= "   +  _adminPwd  +   " ;Persist Security Info=False;Integrated Security=false; " ;
535 
536               //  执行SQL 安装数据库 可选择是恢复或者是直接创建
537               if  ( ! ExistDataBase(_dbName))
538              {
539                   if  ( ! CreateDbAndTable(_dbName))
540                  {
541                       throw   new  ApplicationException( " 创建数据库时出现严重错误! " );
542                  }
543              }
544               else
545              {
546                  MessageBox.Show( " 数据库已经存在,未创建新库,使用原有数据库! " " 提示 " , MessageBoxButtons.OK, MessageBoxIcon.Information);
547              }
548 
549               #region  ----从备份数据库文件恢复数据库 可选二
550               /*
551              // 从备份数据库文件恢复数据库
552              if (!RestoreDB(DBName))
553              {
554                  throw new ApplicationException("恢复数据库时出现严重错误!");
555              }
556               */
557               #endregion
558 
559               #region  ----添加网站 可选三
560 
561               /* *
562              // 添加网站
563              Connect();
564              string serverID = GetNextOpenID().ToString();
565              //string serverComment = websitenName;
566 
567              // 下面的信息为测试,可以自己编写文本框来接收用户输入信息
568              string serverID = "5555";
569              string serverComment = "cqfeng";
570              string defaultVrootPath = this.Context.Parameters["targetdir"];
571              if (defaultVrootPath.EndsWith(@"\"))
572              {
573                  defaultVrootPath = defaultVrootPath.Substring(0, defaultVrootPath.Length - 1);
574              }
575              string HostName = "";
576              string IP = "";
577              string Port = port;
578              string sReturn = CreateWebSite(serverID, serverComment, defaultVrootPath, HostName, IP, Port);
579              * */
580               #endregion
581 
582               //  修改web.config
583               if  ( ! (WriteWebConfig(_conStringName)  &&  WriteWebConfig(_customConStringName)  &&  WriteWebConfig(_masterConStringName)))
584              {
585                   throw   new  ApplicationException( " 设置数据库连接字符串时出现错误 " );
586              }
587 
588               //  写注册表
589              WriteRegistryKey();
590 
591              CreateShortCuts();
592          }
593 
594           #endregion
595           // ?
596           #region  Uninstall 删除
597 
598           public   override   void  Uninstall(IDictionary savedState)
599          {
600               if  (savedState  ==   null )
601              {
602                   throw   new  ApplicationException( " 未能卸载! " );
603              }
604               else
605              {
606                   base .Uninstall(savedState);
607 
608                   // 删除时的方法。在本文中未详细操作,比如删除站点,删除数据库等
609                   /* *删除数据库
610                  SqlCommand delCmd = this._sqlConn.CreateCommand();
611                  try
612                  {
613                      delCmd.CommandText = String.Format("DROP DATABASE {0}", this.Context.Parameters["DBNAME"].ToString());
614                      delCmd.ExecuteNonQuery();
615                  }
616                  finally
617                  {
618                      this._sqlConn.Close();
619                  }* */
620              }
621          }
622           #endregion
623      }
624  }
625 
626 
627   
628 

 

 

在其中用到了另外两个类 文件,如下:

EnSysFolderType:

 

namespace InstallerCL
{
    /// <summary>
    /// 系统文件件的类型
    /// </summary>
    public enum EnSysFolderType
    {
        /// <summary>
        /// 桌面
        /// </summary>
        Desktop = 1,
        /// <summary>
        /// IE网络收藏夹
        /// </summary>
        Favorites = 2,
        /// <summary>
        /// 最近访问文档
        /// </summary>
        Recent = 4,
        /// <summary>
        /// 开始菜单程序
        /// </summary>
        Programe = 8,
        /// <summary>
        /// 发送到
        /// </summary>
        Sendto = 16,
        /// <summary>
        /// Cookies目录
        /// </summary>
        Cookies = 32,
        /// <summary>
        /// 开始启动
        /// </summary>
        Startup = 64
    }

SysFolderManager:

 

 

using System;
using Microsoft.Win32;

namespace InstallerCL
{
    class SysFolderManager
    {
        #region Properties and Cunstrustor
        private const string CurrentPath = @"\software\microsoft\windows\currentversion\explorer\shell folders";
        RegistryKey folders;

        public SysFolderManager()
        {
            folders = OpenRegistryPath(Registry.CurrentUser, CurrentPath);
        }

        #endregion
      
        public string GetFolder(EnSysFolderType type)
        {
            return folders.GetValue(GetRegKey(type)).ToString();
        }

        private RegistryKey OpenRegistryPath(RegistryKey root, string s)
        {
            s = s.Remove(0, 1) + @"\";
            while (s.IndexOf(@"\") != -1)
            {
                root = root.OpenSubKey(s.Substring(0, s.IndexOf(@"\")));
                s = s.Remove(0, s.IndexOf(@"\") + 1);
            }
            return root;
        }

        private static string GetRegKey(EnSysFolderType type)
        {
            string key = null;
            switch (type)
            {
                case EnSysFolderType.Desktop:
                    key = "Desktop";
                    break;
                case EnSysFolderType.Favorites:
                    key = "Favorites";
                    break;
                case EnSysFolderType.Recent:
                    key = "Recent";
                    break;
                case EnSysFolderType.Programe:
                    key = "Programs";
                    break;
                case EnSysFolderType.Sendto:
                    key = "Sendto";
                    break;
                case EnSysFolderType.Cookies:
                    key = "Cookies";
                    break;
                case EnSysFolderType.Startup:
                    key = "Startup";
                    break;
                default:
                    throw new NotSupportedException("UnSupported system folder type.");
            }
            return key;
        }

    }

}

 

DBSQL.sql文件放到此项目中,在属性中设置为“嵌入的资源”

 

回到MyWebSetup项目,点击查看属性,可以设置安装文件到显示相关信息,如图

 

 

 

选择文件系统,如图:

然后:

 

(在文件系统中,在属性里面可以设置安装程序默认到安装路径)

 

添加一个叫bin文件夹并添加在生成网站时bin目录下的dll文件,如图:

 

在应用程序文件夹下在生成网站时目录下的文件,添加后如图:

 

 

选择“用户界面编辑器”,添加两个文本框ABA将作为安装新站点后的IIS设置,B将作为数据库操作时的参数设置,调整位置后如下:

调整A的属性,这里只选择了显示两个输入框,属性分别为IISSERVERPORT,值为localhost9998,其他的你可以自己调整。如图:

 

文本框B的设置如下:

OK,文本框设置完毕。当然,你还可以选择其他的多种文本框,如协议什么的。

 

打开自定义操作面板:

 

 

然后:

CustomActionData中输入:

/dbname=[DBNAME] /server=[DBSERVER] /user=[DBUSER] /pwd=[DBPASSWORD] /iis=[IISSERVER] /proName="XXX信息管理系统" /conStringName="conn" /customConStringName="bdmConnectionString" /masterConStringName="masterConnectionString" /sqlTextFileName="HiisBdm.sql" /port=[PORT] /targetdir="[TARGETDIR]\"

这些参数就是文本框AB上的输入框的值,在安装过程中可以获得,然后进行处理。

 

编译,然后选择安装,如图:

第一图:

第二图:

 

第三图:

抱歉,我不知道在这里怎么使登录密码框输入时显示为*

 

第四图:

第五图:

 

安装:

安装完成:

 

安装后的IIS

 

安装目录:

安装后的数据库:

下面的提交、回滚、卸载都同样设置。

 

12、如果要添加许可协议,先创建一个rtf文件,来包含许可协议的内容,注意此rtf文件不能新建一个word DOC文件,然后将其扩展名再改成rtf,这样许可协议在显示的时候会是乱码,必须打开WORD软件,去新建一个空白文档,然后写入许可协议内容,最后直接保存成rtf格式,随后在【文件系统】的【应用程序文件夹】中添加【文件】,选择此rtf文件,然后在【用户界面】的【安装】-【启动】中选择【许可协议】,设置LicenseFile属性为应用程序文件中的rtf文件。

13、可以为安装包添加卸载程序

A、在系统文件的system32文件夹下找到msiexec.exe。(c:\windows\system32\msiexec.exe)在打包项目中应用程序文件夹中添加文件msiexec.exe。
B、创建msiexec的快捷方式,改此快捷方式的Argmuments属性为“/x {产品ID}”,说明:产品ID的值为打包项目(比如FlowerShopSetup) 的ProductCode属性值,如: /x{BB8D4C5A-B041-489B-84FF-ACF0C8342264}。
C、将快捷方式拖到用户程序菜单中即可,可以为快捷方法重命名,如:卸载FlowerShop,也可以设置快捷方式的Icon属性,为快捷方式指定图标。

 

 

 

至此,一个简单的部署web程序的exe文件已经完成,当然,省略了很多东西,比如,对安装机器的判断(IIS版本,Framework版本,SQL Server版本等),IIS站点属性等设置(默认页面,访问权限,执行权限等),卸载程序时应该删除的东西等等。这些东西,在MSDN里面可以查找到相关说明,如果你需要,只有辛苦一下了,嘿嘿。

相信有了这些,自己用WinForm来写安装程序也时可以了哈。

 

问题:安装的时候输入密码时无法显示为*号;安装文件夹中出现编译后的安装类编译后的dll文件。哪位大哥对这些比较熟悉的,指点指点……………..

 

 

 

转载于:https://www.cnblogs.com/diaoluodexue/archive/2010/10/28/1863459.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值