VS.NET中自定義安裝程序製作經驗總結

內容介紹:
介紹自定義安裝程序的一些注意事項
介紹如何獲取自定義界面和系統參數
介紹如何在安裝過程中添加自定義操作

自定義安裝程序的一些注意事項:
CustomActionData 屬性
自定義操作的附加數據,讀取自定義操作的安裝信息
CustomActionData 屬性採用 /name=value 的格式。多個值必須以單個空格隔開:/name1=value1 /name2=value2。如果值內有一個空格,則必須加引號:/name=“a value”。
可以傳遞 Windows 安裝程序屬性。對於像 [TARGETDIR] 這樣返回目錄的 Windows 安裝程序屬性,除了加括號外,還必須加引號和尾部反斜槓:/name=“[TARGETDIR]/”。
爲了使自定義操作被視爲安裝組件,必須將 InstallerClass 屬性設置爲 true

以下是兩個截自VS.NET2003,關於自定義安裝的一些可以引用的系統屬性:
Install1.jpg

Install2.jpg


自定義安裝需要創建一些界面,然後獲取這些界面的文本輸入等信息,下面兩個圖介紹如何進行操作:

其中途中的文本框和複選框是作者添加的自定義界面。
Install4.jpg

爲自定義安裝添加自定義安裝操作,指定來自定義安裝的工程,如InstallAction即可。
Install5.jpg


如何獲取自定義界面和系統參數:
在自定義操作中添加CustomActionData 屬性數據.
/ConnectionString="[CONNECTIONSTRING]" /vdir=[TARGETVDIR] /targetdir="[TARGETDIR]/"

在代碼中引用參數

string virtualRoot = this.Context.Parameters["vdir"]; // 安裝虛擬路徑
string physicalRoot = this.Context.Parameters["targetdir"]; // 安裝物理路徑
string connectionString = this.Context.Parameters["ConnectionString"]; // 系統數據庫鏈接字符串


如何在安裝過程中添加自定義操作:
運行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創建虛擬目錄:

Install3.jpg

覆蓋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();
}

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章