制作web安装程序
出处:http://www/i-blog.cn/u/chenli/archives/2006/8.html
本文参考http://blog.csdn.net/libra1983/archive/2006/09/25/1274933.aspx
1、1. 打开VS2005,创建一个新的工程,选择:其他项目类型->安装和部署->安装项目。名称为Setup,确定。
2、2. 在文件系统中加入要安装的所有文件和文件夹。可在应用程序文件夹节点上单击鼠标右键,选择添加文件或文件夹。这里注意,如果要添加的文件夹中还有子文件夹这样添加会有点麻烦。可以先选择应用程序文件夹,在资源管理器中选择所有要安装的文件和文件夹,直接将选择的文件和文件夹拖放到VS2005的应用程序文件夹中(VS2005此时中间的部分)。
3、 3. 添加一个新项目,这里选择Visual C#的类库。用来在安装过程中添加MS Sql Server数据库,以及在IIS中创建网站。命名为SetupClassLibrary,确定。
4、4. 在安装数据库时,会执行脚本。在SetupClassLibrary项目中加入一个名为DBSQL.txt的文件,将要执行的脚本放在里面。将该文件的属性中生成操作属性设为:嵌入的资源。注意该脚本只是创建表和存储过程等,不是创建数据库的,而且不要含有“GO”命令,如果有“GO”命令可以用替换的方法把“GO”换成空白。
5、5. 删除SetupClassLibrary中自动生成的Class1.cs。在SetupClassLibrary中添加新的项。选择安装程序类。命名为SetupInstaller.cs,确定。
6、6. 在SetupInstaller.cs的代码试图中可以看到SetupInstaller类继承自Installer。这里要重写Installer的几个方法,来处理安装过程中的行为。
7、7. 重写Installer的Install方法。该方法在安装时执行。还可以重写Commit(完成)、Rollback(回滚)、Uninstall(卸载)。SetupInstaller.cs中所有的代码在附录中。可以直接复制过来。需要添加的引用有:System.DirectoryServices。然后编译这个项目。
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
dir = this.Context.Parameters["TARGETDIR"];
DBName = this.Context.Parameters["DBNAME"].ToString();
ServerName = this.Context.Parameters["DBSERVERNAME"].ToString();
AdminName = this.Context.Parameters["USERNAME"].ToString();
AdminPwd = this.Context.Parameters["PASSWORD"].ToString();
iis = this.Context.Parameters["IISSERVER"].ToString();
port = this.Context.Parameters["PORT"].ToString();
//写入获取的安装程序中的变量,此段代码为调试用可以不添加
this.sqlConn.ConnectionString = "Packet size=4096;User ID=" + AdminName + ";Data Source=" + ServerName + ";Password=" + AdminPwd + ";Persist Security Info=False;Integrated Security=false";
// 执行SQL 安装数据库可选择时恢复或者时直接创建
if (!CreateDBAndTable(DBName))
{
throw new ApplicationException("创建数据库时出现严重错误!");
}
// 从备份数据库文件恢复数据库
/*
if (!RestoreDB(DBName))
{
throw new ApplicationException("恢复数据库时出现严重错误!");
}
*/
// 添加网站
Connect();
//string serverID = GetNextOpenID().ToString();
//string serverComment = websitenName;
// 下面的信息为测试,可以自己编写文本框来接收用户输入信息
string serverID = "5555";
string serverComment = "PortalSite";
string defaultVrootPath = this.Context.Parameters["targetdir"];
if (defaultVrootPath.EndsWith(@"\"))
{
defaultVrootPath = defaultVrootPath.Substring(0, defaultVrootPath.Length - 1);
}
string HostName = "";
string IP = "";
string Port = port;
string sReturn = CreateWebSite(serverID, serverComment, defaultVrootPath, HostName, IP, Port);
// 修改web.config
//if (!WriteWebConfig())
//{
// throw new ApplicationException("设置数据库连接字符串时出现错误");
//}
// 写注册表
//WriteRegistryKey();
}
8、8. 在安装项目Setup中打开用户界面编辑器,这里要在安装向导中加入设置数据库以及IIS的地方。在启动节点单击鼠标右键,添加对话框,把文本框(A)和文本框(B)都添加进来。把他们拖到确认安装的上面。
9、9. 设置文本框(A)的属性。BodyText:输入新网站的设置;Edit1Label:服务器;Edit1Property:IISSERVER;Edit1:localhost;Edit2Label:端口;Edit2Property:PORT;Edit2:9998;Edit3Visible:False;Edit4Visible:False;
10. 设置文本框(B)的属性。BodyText:数据库设置;Edit1Label:数据库服务器;Edit1Property:DBSERVERNAME;Edit1:localhost;Edit2Label:数据库名称;Edit2Property:DBNAME;Edit2:Portal;Edit1Labe3:登录帐号;Edit3Property:USERNAME; Edit4Label:密码;Edit4Property:PASSWORD;
11 加入自定义的操作。在安装项目Setup中打开自定义操作编辑器。在安装节点单击鼠标右键,添加自定义操作。双击应用程序文件夹,点击添加程序集按钮,选择“浏览”页,找到并选择SetupClassLibrary项目生成的程序集SetupClassLibrary.dll,确定。安装节点下多了一个SetupClassLibrary.dll节点,在该节点单击鼠标右键,选择属性,设置CustomActionData属性为/DBNAME=[DBNAME] /DBSERVERNAME=[DBSERVERNAME] /USERNAME=[USERNAME] /PASSWORD=[PASSWORD] /IISSERVER=[IISSERVER] /PORT=[PORT] /TARGETDIR="[TARGETDIR]\"
12. 先重新生成SetupClassLibrary项目,然后生成Setup项目。生成完毕后在Setup项目的Debug目录下可以找到Setup.msi文件和setup.exe文件。现在可以执行安装程序看看效果了。也可以在解决方案管理器的Setup项目节点上单击鼠标右键,选择安装。
附录:SetupInstaller.cs的所有代码
using System.DirectoryServices;
using System.Management;
using System.Collections;
using System.Data;
using System;
using System.Reflection;
using System.IO;
using System.Configuration.Install;
using Microsoft.Win32;
using System.ComponentModel;
namespace SetupClassLibrary
{
[RunInstaller(true)]
public partial class SetupInstaller : Installer
{
public SetupInstaller()
{
InitializeComponent();
}
private System.Data.SqlClient.SqlConnection sqlConn=new System.Data.SqlClient.SqlConnection();
private System.Data.SqlClient.SqlCommand Command;
private string DBName;
private string ServerName;
private string AdminName;
private string AdminPwd;
private string iis;
private string port;
private string dir;
public static string VirDirSchemaName = "IIsWebVirtualDir";
private string _target;
private DirectoryEntry _iisServer;
private ManagementScope _scope;
private ConnectionOptions _connection;
#region ConnectDatabase 连接数据库
private bool ConnectDatabase()
{
if (Command.Connection.State != ConnectionState.Open)
{
try
{
Command.Connection.Open();
}
catch (Exception e)
{
return false;
}
}
return true;
}
#endregion
#region GetSql 从文件中读取SQL,在读取包含SQL脚本的文件时需要用到,参考自MSDN
private string GetSql(string Name)
{
try
{
Assembly Asm = Assembly.GetExecutingAssembly();
Stream strm = Asm.GetManifestResourceStream(Asm.GetName().Name + "." + Name);
StreamReader reader = new StreamReader(strm);
return reader.ReadToEnd();
}
catch (Exception getException)
{
throw new ApplicationException(getException.Message);
}
}
#endregion
#region ExecuteSql 执行SQL语句,参考自MSDN
private void ExecuteSql(string DataBaseName, string sqlstring)
{
Command = new System.Data.SqlClient.SqlCommand(sqlstring, sqlConn);
if (ConnectDatabase())
{
try
{
Command.Connection.ChangeDatabase(DataBaseName);
Command.ExecuteNonQuery();
}
finally
{
Command.Connection.Close();
}
}
}
#endregion
#region CreateDBAndTable 创建数据库及数据库表,参考自MSDN
protected bool CreateDBAndTable(string DBName)
{
bool Restult = false;
//try
//{
ExecuteSql("master", "USE MASTER IF EXISTS (SELECT NAME FROM SYSDATABASES WHERE NAME='" + DBName + "') DROP DATABASE " + DBName);
ExecuteSql("master", "CREATE DATABASE " + DBName);
ExecuteSql(DBName, GetSql("DBSQL.txt"));
Restult = true;
//}
//catch
//{
//}
return Restult;
}
#endregion
#region RestoreDB 从备份文件恢复数据库及数据库表
///
/// 从备份文件恢复数据库及数据库表
///
///数据库名
///配件中数据库脚本资源的名称
///
protected bool RestoreDB(string DBName)
{
dir = this.Context.Parameters["targetdir"];
bool Restult = false;
string MSQL = "RESTORE DATABASE " + DBName +
" FROM DISK = '" + dir + @"data.bak' " +
" WITH MOVE 'Test' TO '" + @"c:\" + DBName + ".mdf', " +
" MOVE 'Test_log' TO '" + @"c:\" + DBName + ".ldf' ";
try
{
ExecuteSql("master", "USE MASTER IF EXISTS (SELECT NAME FROM SYSDATABASES WHERE NAME='" + DBName + "') DROP DATABASE " + DBName);
ExecuteSql("master", MSQL);
Restult = true;
}
finally
{
// 删除备份文件
try
{
File.Delete(dir + @"data.bak");
}
catch
{
}
}
return Restult;
}
#endregion
#region WriteWebConfig 修改web.config的连接数据库的字符串
private bool WriteWebConfig()
{
System.IO.FileInfo FileInfo = new System.IO.FileInfo(this.Context.Parameters["targetdir"] + "/web.config");
if (!FileInfo.Exists)
{
throw new InstallException("Missing config file :" + this.Context.Parameters["targetdir"] + "/web.config");
}
System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
xmlLoad(FileInfo.FullName);
bool FoundIt = false;
foreach (System.Xml.XmlNode Node in xmlDocument["configuration"]["appSettings"])
{
if (Node.Name == "add")
{
if (Node.Attributes.GetNamedItem("key"). == "ConnectionString")
{
Node.Attributes.GetNamedItem(""). = 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);
FoundIt = true;
}
}
}
if (!FoundIt)
{
throw new InstallException("Error when writing the config web.config");
}
xmlSave(FileInfo.FullName);
return FoundIt;
}
#endregion
#region WriteRegistryKey 写注册表。安装部署中,直接有一个注册表编辑器,可以在那里面设置。
private void WriteRegistryKey()
{
// 写注册表
RegistryKey hklm = Registry.LocalMachine;
RegistryKey cqfeng = hklm.OpenSubKey("SOFTWARE", true);
RegistryKey F = cqfeng.CreateSubKey("cqfeng");
F.Set("FilePath", "kkkk");
}
#endregion
#region Connect 连接IIS服务器
public bool Connect()
{
if (iis == null)
return false;
try
{
_iisServer = new DirectoryEntry("IIS://" + iis + "/W3SVC/1");
_target = iis;
_connection = new ConnectionOptions();
_scope = new ManagementScope(@"\\" + iis + @"\root\MicrosoftIISV2", _connection);
_scope.Connect();
}
catch
{
return false;
}
return IsConnected();
}
public bool IsConnected()
{
if (_target == null || _connection == null || _scope == null) return false;
return _scope.IsConnected;
}
#endregion
#region IsWebSiteExists 判断网站是否已经存在
public bool IsWebSiteExists(string serverID)
{
try
{
string siteName = "W3SVC/" + serverID;
ManagementObjectSearcher searcher = new ManagementObjectSearcher(_scope, new ObjectQuery("SELECT * FROM IIsWebServer"), null);
ManagementObjectCollection webSites = searcher.Get();
foreach (ManagementObject webSite in webSites)
{
if ((string)webSite.Properties["Name"]. == siteName)
return true;
}
return false;
}
catch
{
return false;
}
}
#endregion
#region GetNextOpenID 获得一个新的ServerID
private int GetNextOpenID()
{
DirectoryEntry iisComputer = new DirectoryEntry("IIS://localhost/w3svc");
int nextID = 0;
foreach (DirectoryEntry iisWebServer in iisComputer.Children)
{
string sname = iisWebServer.Name;
try
{
int name = int.Parse(sname);
if (name > nextID)
{
nextID = name;
}
}
catch
{
}
}
return ++nextID;
}
#endregion
#region CreateWebsite 添加网站
public string CreateWebSite(string serverID, string serverComment, string defaultVrootPath, string HostName, string IP, string Port)
{
try
{
ManagementObject oW3SVC = new ManagementObject(_scope, new ManagementPath(@"IIsWebService='W3SVC'"), null);
if (IsWebSiteExists(serverID))
{
return "Site Already Exists...";
}
ManagementBaseObject inputParameters = oW3SVC.GetMethodParameters("CreateNewSite");
ManagementBaseObject[] serverBinding = new ManagementBaseObject[1];
serverBinding[0] = CreateServerBinding(HostName, IP, Port);
inputParameters["ServerComment"] = serverComment;
inputParameters["ServerBindings"] = serverBinding;
inputParameters["PathOfRootVirtualDir"] = defaultVrootPath;
inputParameters["ServerId"] = serverID;
ManagementBaseObject outParameter = null;
outParameter = oW3SVC.InvokeMethod("CreateNewSite", inputParameters, null);
// 启动网站
string serverName = "W3SVC/" + serverID;
ManagementObject webSite = new ManagementObject(_scope, new ManagementPath(@"IIsWebServer='" + serverName + "'"), null);
webSite.InvokeMethod("Start", null);
return (string)outParameter.Properties["Return"].;
}
catch (Exception ex)
{
return ex.Message;
}
}
public ManagementObject CreateServerBinding(string HostName, string IP, string Port)
{
try
{
ManagementClass classBinding = new ManagementClass(_scope, new ManagementPath("ServerBinding"), null);
ManagementObject serverBinding = classBinding.CreateInstance();
serverBinding.Properties["Hostname"]. = HostName;
serverBinding.Properties["IP"]. = IP;
serverBinding.Properties["Port"]. = Port;
serverBinding.Put();
return serverBinding;
}
catch
{
return null;
}
}
#endregion
#region Install 安装
///
/// 安装数据库
///
///
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
dir = this.Context.Parameters["TARGETDIR"];
DBName = this.Context.Parameters["DBNAME"].ToString();
ServerName = this.Context.Parameters["DBSERVERNAME"].ToString();
AdminName = this.Context.Parameters["USERNAME"].ToString();
AdminPwd = this.Context.Parameters["PASSWORD"].ToString();
iis = this.Context.Parameters["IISSERVER"].ToString(); ;
port = this.Context.Parameters["PORT"].ToString();
//写入获取的安装程序中的变量,此段代码为调试用可以不添加
this.sqlConn.ConnectionString = "Packet size=4096;User ID=" + AdminName + ";Data Source=" + ServerName + ";Password=" + AdminPwd + ";Persist Security Info=False;Integrated Security=false";
// 执行SQL 安装数据库 可选择时恢复或者时直接创建
if (!CreateDBAndTable(DBName))
{
throw new ApplicationException("创建数据库时出现严重错误!");
}
// 从备份数据库文件恢复数据库
/*
if (!RestoreDB(DBName))
{
throw new ApplicationException("恢复数据库时出现严重错误!");
}
*/
// 添加网站
Connect();
//string serverID = GetNextOpenID().ToString();
//string serverComment = websitenName;
// 下面的信息为测试,可以自己编写文本框来接收用户输入信息
string serverID = "5555";
string serverComment = "PortalSite";
string defaultVrootPath = this.Context.Parameters["targetdir"];
if (defaultVrootPath.EndsWith(@"\"))
{
defaultVrootPath = defaultVrootPath.Substring(0, defaultVrootPath.Length - 1);
}
string HostName = "";
string IP = "";
string Port = port;
string sReturn = CreateWebSite(serverID, serverComment, defaultVrootPath, HostName, IP, Port);
// 修改web.config
//if (!WriteWebConfig())
//{
// throw new ApplicationException("设置数据库连接字符串时出现错误");
//}
// 写注册表
//WriteRegistryKey();
}
#endregion
#region Uninstall 删除
public override void Uninstall(IDictionary savedState)
{
if (savedState == null)
{
throw new ApplicationException("未能卸载!");
}
else
{
base.Uninstall(savedState);
}
}
#endregion
制作web安装程序的更多相关文章
- 制作Java安装程序
这个工具利用 ANT 来制作在 Windows, MacOS X, Unix 平台上可执行的文件,比如 exe,zip,jar.ROXES ANT Tasks 基于 GPL 发布. http://ww ...
- C#制作自定义安装程序
(一),安装程序 以前用vs制作过安装程序,现在把步骤写出来,有帮助的大家一定要顶哦 第一步:建立工程 1.打开vs,新建项目->其他项目类型->安装和部署(這個子项下面有安装项目和Web ...
- 制作PHP安装程序的原理和步骤56
制作PHP安装程序的原理和步骤56 1.制作PHP安装程序的原理和步骤检查目录或文件的权限----修改或填加配置文件---检查配置文件正 确性---导入数据库----锁定或删除安装文件 原理: 其实P ...
- ASP.NET Web安装程序
键发布ASP.NET Web安装程序,搞WebForm的童鞋看过来... 前言:最近公司有个Web要发布,但是以前都是由实施到甲方去发布,配置,这几天有点闲,同事让我搞一个一键发布,就和安装软件那样的 ...
- C# 批处理制作静默安装程序包
使用批处理+WinRAR制作静默安装程序包 @echo 安装完窗口会自动关闭!!! @echo off start /wait Lync.exe /Install /Silent start /wai ...
- 一键发布ASP.NET Web安装程序
转载自:http://www.cnblogs.com/nangong/p/Web.html 前言:最近公司有个Web要发布,但是以前都是由实施到甲方去发布,配置,这几天有点闲,同事让我搞 ...
- [原创*精华]一键发布ASP.NET Web安装程序,搞WebForm的童鞋看过来...
重要更新:鉴于很多小伙伴们说看不到图,我这边换了几个浏览器看了下,都看得到的,估计是网速问题,请耐心等待,另外,为了更好的方便大家学习,特此提供源码以及一个word文档,word文档就是本 ...
- 怎样制作C#安装程序
近期须要制作一个C#安装.在网上找了一些资料发现都不是非常完整,最后自己综合了一些资料,而且通过亲自检測,最后成功完毕C#打包成安装程序(打包成最简单的一种安装程序.假设须要更高的功能请自己在开发). ...
- vb6.0安装程序制作图解教程
如何制作vb安装程序,是在学习Vb6.0过程中比较常见的一个入门问题. 在此笔者介绍一个最简单的安装方法,就是用VB自带的打包程序进行打包,虽然比较普通,不过内部却有不少窍门,相信这一点知道的人可能不 ...
随机推荐
- SocketAsyncEventArgs
SocketAsyncEventArgs是.net提供的关于异步socket类,封装了IOCP的使用,可以用它方便的实现NIO(non-blocking IO) NIO对于提升某些场景下Server性 ...
- RDD介绍与执行
repartition 增加或减少分区.会产生shuffle.(多个分区分到一个分区不会产生shuffle) coalesce coalesce常用来减少分区,第二个参数是减少分区的过程中是否产生sh ...
- java学习(五)java类继承
1.制作一个工具类的文档 javadoc -d 目录 -author -version arrayTool.java 实例: class arrayDemo { public static voi ...
- hyper-v开发包之ddtkh
ddtkh是微软开源社区的项目,实质是.net对象封装的一系列powershell命令,在结构上更直观更易用.它集成scvmm虚拟机管理.scom虚拟机资源监控和DPM数据保护等几种功能包.
- Windows上编译Boost
Boost做得很好,有自己的build系统,可以几乎一键式编译,这才是尼玛世界一流质量的良心开源库啊. 将Boost 1.49.0解压到boost/boost_1_49_0里面,然后在boost目录底 ...
- VS 发布MVC网站缺少视图解决方案
VS 发布MVC网站缺少视图解决方案 mvc项目发布之后会有一些视图文件缺少,不包含在发布文件中,虽然可以直接从项目文件中直接拷贝过来,但还是想知道是什么原因,发布文件好像没有找到哪里有设置这个的地 ...
- Linux Shell 编程学习笔记
1:Shell Script中if语句的条件部分要以分号来分隔 2:要注意条件测试部分中的空格.在方括号的两侧都有空格 3:echo "Hi, ${a}s" 单引号中的变量不会进行 ...
- 忽略warning 警告
1
- “全栈2019”Java第五十五章:方法的静态绑定与动态绑定
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- CentOS 下安装 SNMP 服务
CentOS 中搭建 SNMP 服务 0.前言 首先这个服务我不知道有什么用,学习CCNA的也许有了解.所以这里仅仅只是教做题,下面还有一些搜到的配置文件希望会大家有所帮助. 简单网络管理协议(SNM ...