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

 

修改文件如下:

 

 

代码
  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 文件。哪位大哥对这些比较熟悉的,指点指点 ……………..

 

 

地址:http://www.cnblogs.com/diaoluodexue/archive/2010/10/28/1863459.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值