內容介紹:
介紹自定義安裝程序的一些注意事項
介紹如何獲取自定義界面和系統參數
介紹如何在安裝過程中添加自定義操作
自定義安裝程序的一些注意事項:
CustoMactionData 屬性
自定義操作的附加數據,讀取自定義操作的安裝信息
CustoMactionData 屬性采用 /name=value 的格式。多個值必須以單個空格隔開:/name1=value1 /name2=value2。如果值內有一個空格,則必須加引號:/name=“a value”。
可以傳遞 Windows 安裝程序屬性。對於像 [TARGETDIR] 這樣返回目錄的 Windows 安裝程序屬性,除了加括號外,還必須加引號和尾部反斜槓:/name=“[TARGETDIR]\”。
為了使自定義操作被視為安裝組件,必須將 InstallerClass 屬性設置為 true
以下是兩個截自VS.Net2003,關於自定義安裝的一些可以引用的系統屬性:
自定義安裝需要創建一些界面,然後獲取這些界面的文本輸入等信息,下面兩個圖介紹如何進行操作:
其中途中的文本框和復選框是作者添加的自定義界面。
為自定義安裝添加自定義安裝操作,指定來自定義安裝的工程,如InstallAction即可。
如何獲取自定義界面和系統參數:
在自定義操作中添加CustoMactionData 屬性數據.
/ConnectionString="[CONNECTIONSTRING]" /vdir=[TARGETVDIR] /targetdir="[TARGETDIR]\"
在代碼中引用參數
如何在安裝過程中添加自定義操作:
運行DOS命令
在創建虛擬目錄或者安裝數據庫腳本等操作需要調用DOS命令
System.Diagnostics.ProcessWindowstyle.Hidden是執行命令而不顯示DOS窗口
/**//// <summary>
/// 後台執行DOS文件
/// </summary>
/// <param name="fileName">文件名(包含路徑)</param>
/// <param name="argument">運行參數</param>
/// <param name="hidden">是否隱藏窗口</param>
private void RunDOS(string fileName, string argument, bool hidden)
{
Process process = new Process();
process.EnableRaisingEvents = false;
process.StartInfo.FileName = string.Format("\"{0}\"", fileName);
process.StartInfo.Arguments = argument;
if (hidden)
{
process.StartInfo.WindowStyle = ProcessWindowstyle.Hidden;
}
else
{
process.StartInfo.WindowStyle = ProcessWindowstyle.Normal;
}
process.Start();
process.WaitForExit();
}
使用活動目錄DirectoryEntry創建虛擬目錄:
覆蓋Installer的函數實現自定義安裝及卸載:
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
SaveConfig(); //保存配置文件到文件,並保存到數據庫中
SetupDB(); //安裝Sql腳本
InstallService(); //安裝Windows服務
}
protected override void OnBeforeUninstall(System.Collections.IDictionary savedState)
{
base.OnBeforeUninstall (savedState);
UnInstallService();//卸載Windows服務
}
在自定義安裝中執行數據庫腳本:
/**//// <summary>
/// 執行SQL腳本
/// </summary>
/// <param name="path">腳本文件路徑全名</param>
/// <param name="userID">數據庫登錄ID</param>
/// <param name="passWord">數據庫登錄密碼</param>
/// <param name="server">數據庫服務器地址</param>
private void DOSQL(string path, string userID, string passWord, string server)
{
// -U -P -S -i關鍵字區分大小寫
string arguments = String.Format(" -U {0} -P {1} -S {2} -i \"{3}\"", userID, passWord, server, path);
this.RunDOS("osql.exe", arguments, false);
}
Log目錄創建授權操作:
/**//// <summary>
/// 創建Log目錄並授權[Authenticated Users]可寫
/// </summary>
private void CreateLogDirAndAuthorize()
{
string logDir = this.Context.Parameters["targetdir"] + "log";
CreateDir(logDir);
string patrolLogDir = this.Context.Parameters["targetdir"] + "YourWebDir/log";
CreateDir(patrolLogDir);
}
/**//// <summary>
/// 根據指定的路徑和用戶名, 創建目錄並授權
/// </summary>
/// <param name="logPathName">指定的目錄絕對路徑</param>
/// <returns></returns>
private void CreateDir(String logPathName)
{
Directory.CreateDirectory(logPathName);
System.Diagnostics.Process process = new System.Diagnostics.Process();
process.StartInfo.FileName = "cacls.exe";
process.StartInfo.Arguments = logPathName + " /G \"Authenticated Users\":F";
process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowstyle.Normal;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardInput = true;
process.StartInfo.RedirectStandardError = true;
process.Start();
process.StandardInput.WriteLine("Y");
process.WaitForExit();
process.Close();
process.Dispose();
}