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 TabelSQL

 一、建立网站

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

 

 

 

posted on 2010-10-28 14:50  凋落的雪  阅读(2981)  评论(3编辑  收藏  举报

导航