利用VS2005的“Web安裝項目”建立安裝包很難對安裝過程進行詳細控制,因此直接采用“安裝項目”來建立web程序安裝包。我們需要安裝過程中自動創建虛擬目錄,并且可以修改數據庫連接字符串,假設我們在安裝過程中需要用戶修改web.config文件里連接字符串其形式如下:
<configuration>
...
<connectionStrings>
<add name="myDataBase" connectionString="Database=testDataBase;Server=10.78.25.23;Uid=sa;Pwd=123;" providerName="System.Data.SqlClient"/>
</connectionStrings>
...
</configuration>
則建立安裝包的過程如下:
1)發布網站:右鍵點擊web項目,在彈出菜單里點擊“發布網站”將它發布到本地機器。
2)新建安裝項目:從菜單處依次點 文件->新建->文件->項目->其他項目類型->安裝和部署->安裝項目,輸入名稱與位置,并確定。在項目屬性里設置相應的說明內容。
3)在啟動項里添加文本框:右鍵點擊項目,在彈出菜單里選擇視圖->用戶界面,出現用戶界面的樹形結構。右鍵點擊“啟動”節點,添加“文本框(A)”與“文本框(B)”,并將它們移動到“安裝文件夾”之上。這兩個界面用來接收用戶安裝過程中輸入的“web服務地址與虛擬目錄”和“數據庫連接字符串”。兩個文本框的屬性設置如下:
文本框(A)
BannerText:網站設置
BodyText:設置web服務地址與虛擬目錄
Edit1Label:web服務器:
Edit1Property:IISSERVER //這個是自己起的名字
Edit1Value:localhost //此為默認值,可不設置
Edit1Visible:True
Edit2Label:虛擬目錄:
Edit2Property:VIRTUALDIR //這個是自己起的名字
Edit2Value:testWeb //此為默認值,可不設置
Edit2Visible:True
Edit3Visible:False
Edit4Visible:False
文本框(B)
BannerText:數據庫設置
BodyText:設置數據庫連接字符串
Edit1Label:數據庫服務器:
Edit1Property:DBSERVERNAME //這個是自己起的名字
Edit1Value:10.78.25.23 //此為默認值,可不設置
Edit1Visible:True
Edit2Label:數據庫名稱:
Edit2Property:DBNAME //這個是自己起的名字
Edit2Value:testDataBase //此為默認值,可不設置
Edit2Visible:True
Edit3Label:登錄帳號:
Edit3Property:USERNAME //這個是自己起的名字
Edit3Value:sa //此為默認值,可不設置
Edit3Visible:True
Edit4Label:登錄密碼:
Edit4Property:PASSWORD //這個是自己起的名字
Edit4Value:
Edit4Visible:True
4)建立安裝程序類:新建一c#類庫項目“SetupClassLibrary”,然后右鍵 添加->新建項->安裝程序類,建立一安裝程序類如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.IO;
using System.DirectoryServices;
using System.Reflection;
using System.Data;
using System.Data.SqlClient;
using System.Configuration.Install;
using System.Management;
using System.Collections;
using Microsoft.Win32;
using System.Collections.Specialized;
namespace SetupClassLibrary
{
[RunInstaller(true)]
public partial class MyInstaller : Installer
{
//先設置私有成員,對應安裝程序里接收到的用戶輸入
private string dbname;
private string dbserver;
private string user;
private string pwd;
private string iis;
private string physicaldir;
private string virtualdir;
public static string VirDirSchemaName = "IIsWebVirtualDir";
private string _target;
private DirectoryEntry _iisServer;
private ManagementScope _scope;
private ConnectionOptions _connection;
public MyInstaller()
{
InitializeComponent();
}
WriteWebConfig 修改web.config的連接數據庫的字符串 WriteWebConfig 修改web.config的連接數據庫的字符串
private void WriteWebConfig()
{
//加載配置文件
System.IO.FileInfo FileInfo = new System.IO.FileInfo(this.Context.Parameters["targetdir"] + "/web.config");
if (!FileInfo.Exists)
{
throw new InstallException("缺少配置文件 :" + this.Context.Parameters["targetdir"] + "/web.config");
}
System.Xml.XmlDocument xmlDocument = new System.Xml.XmlDocument();
xmlDocument.Load(FileInfo.FullName);
//修改連接字符串
foreach (System.Xml.XmlNode Node in xmlDocument["configuration"]["connectionStrings"])
{
if (Node.Name == "add")
{
if (Node.Attributes.GetNamedItem("name").Value == "myDataBase")
{
Node.Attributes.GetNamedItem( "connectionString").Value = String.Format("Database={0};Server={1};Uid={2};Pwd={3};", dbname, dbserver, user, pwd);
}
}
}
xmlDocument.Save(FileInfo.FullName);
}
#endregion
創建虛擬目錄 創建虛擬目錄
private void CreateVirtualDir()
{
string constIISWebSiteRoot = "IIS://"+iis+"/W3SVC/1/ROOT";
DirectoryEntry root = new DirectoryEntry(constIISWebSiteRoot);
DirectoryEntry tbEntry = root.Children.Add(virtualdir, root.SchemaClassName);
tbEntry.Properties["Path"][0] = physicaldir;//設置物理地址
tbEntry.Invoke("AppCreate", true);
//tbEntry.Properties["DefaultDoc"][0] = "Default.aspx";//設置起始頁
tbEntry.CommitChanges();
}
#endregion
Install 從這里開始啟動安裝 Install 從這里開始啟動安裝
public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);
physicaldir = this.Context.Parameters["targetdir"].ToString();
virtualdir = this.Context.Parameters["virtualdir"].ToString();
dbname = this.Context.Parameters["dbname"].ToString();
dbserver = this.Context.Parameters["dbserver"].ToString();
user = this.Context.Parameters["user"].ToString();
pwd = this.Context.Parameters["pwd"].ToString();
iis = this.Context.Parameters["iis"].ToString();
// 添加網站
CreateVirtualDir();
// 修改web.config
WriteWebConfig();
}
#endregion
Uninstall 刪除 Uninstall 刪除
public override void Uninstall(IDictionary savedState)
{
//添加自定義的卸載代碼
if (savedState == null)
{
throw new ApplicationException("未能卸載!");
}
else
{
base.Uninstall(savedState);
}
}
#endregion
}
}
5)添加項目輸出:
編譯生成“SetupClassLibrary”
然后右鍵單擊2)中建立的安裝項目 添加->項目輸出中選擇“SetupClassLibrary”,選中“主輸出”,單擊“確定”。這樣你可以在解決方案安裝項目樹中看見多了“主輸出來自SetupClassLibrary(活動)”節點。
再右鍵此安裝項目 視圖->自定義操作 中選擇“安裝”節點,右鍵 “添加自定義操作”,進入“應用程序文件夾”,選中“主輸出來自SetupClassLibrary(活動)”,單擊“確定。
選中“安裝”下的“主輸出來自SetupClassLibrary(活動)”節點,在其屬性窗口中設置CustomActionData 的值為 /dbname=[DBNAME] /dbserver=[DBSERVERNAME] /user=[USERNAME] /pwd=[PASSWORD] /iis=[IISSERVER] /virtualdir=[VIRTUALDIR] /targetdir="[TARGETDIR]"",這是設置文本框(A)和文本框(B)中的輸入與安裝程序類中要訪問的變量之間的對應關系,其中 targetdir="[TARGETDIR]""代表應用程序安裝目錄(注意:各個對應關系之間必須用空格隔開)。
6)添加文件:這一步,我們將發布網站時生成的文件夾全部克隆到安裝項目中。
右鍵安裝項目,視圖->文件系統 在“應用程序文件夾”下按發布網站時生成的文件夾里的結構添加文件夾與文件。
說明:
1.這些文件都需要我們從發布網站的文件夾里添加進來,比如一般需要建立對應的“bin”文件夾,并在里面添加對應的程序集文件,而且一般我們會在“應用程序文件夾”根下添加web.config文件。
2.這里的文件將被復制到目標計算機上,此安裝項目將在目標計算機上建立虛擬目錄指向此文件夾。
7)編譯生成,OK! 到安裝項目的debug或者release目錄下可看見生成的安裝包。