程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> .NET實例教程 >> VS.NET中自定義安裝程序制作經驗總結

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

編輯:.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();
}
 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved