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
修改文件如下:
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文件,如图:
在应用程序文件夹下在生成网站时目录下的文件,添加后如图:
选择“用户界面编辑器”,添加两个文本框A和B,A将作为安装新站点后的IIS设置,B将作为数据库操作时的参数设置,调整位置后如下:
调整A的属性,这里只选择了显示两个输入框,属性分别为IISSERVER和PORT,值为localhost和9998,其他的你可以自己调整。如图:
文本框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]\"
这些参数就是文本框A和B上的输入框的值,在安装过程中可以获得,然后进行处理。
编译,然后选择安装,如图:
第一图:
第二图:
第三图:
抱歉,我不知道在这里怎么使登录密码框输入时显示为*号
第四图:
第五图:
安装:
安装完成:
安装后的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