如何在安裝過程中部署DevExpress控件


在我的Winform開發框架或者WCF開發框架中,均提供多種界面樣式選擇,其中有一種就是界面效果比較好的DevExpress控件界面樣式,但是我們一般在開發環境中使用,安裝包的大小都很大,100多M,那么我們在部署到客戶端應用的時候,該如何操作呢?

我們分析DevExpress的特殊補丁發現,他們是一個DOS批處理文件,主要是創建相應的目錄,然后把DevExpress的三個特殊文件復制到對應的目錄中,就可以實現DevExpress的正常使用了。那個DOS批處理文件內容如下所示。

一般我們部署客戶端應用的時候,都會制作一個安裝包,我們只需要自定義安裝操作中正確執行這些DOS命令即可。

但是,在實際安裝過程中,由於執行Register.bat文件的時候,gacutil.exe會以System目錄作為起始目錄,那么就會導致以上操作失敗,找不到對應的目錄,因為默認System目錄下面沒有gacUtil的文件,更沒有要拷貝的DevExpress.Data.v11.1.dll等三個dll文件。那么我們應該如何操作才能正確執行DOS命令,完成順利部署DevExpress的幾個特殊的dll文件呢?

1、首先我們創建一個安裝工程,並添加以上的特殊注冊文件到安裝包中,然后修改Register.bat文件的內容,增加一個路徑變量"{INSTALL_PATH}",該路徑變量會在安裝的時候被替換為具體的路徑名稱。修改后的文件如下所示。

@echo off

set path="{INSTALL_PATH}"

gacutil -u "{INSTALL_PATH}\DevExpress.Data.v11.1"
mkdir %windir%\assembly\GAC_MSIL\DevExpress.Data.v11.1\11.1.6.0__b88d1754d700e49a
copy "{INSTALL_PATH}\DevExpress.Data.v11.1.dll" %windir%\assembly\GAC_MSIL\DevExpress.Data.v11.1\11.1.6.0__b88d1754d700e49a

gacutil -u "{INSTALL_PATH}\DevExpress.Utils.v11.1"
mkdir %windir%\assembly\GAC_MSIL\DevExpress.Utils.v11.1\11.1.6.0__b88d1754d700e49a
copy "{INSTALL_PATH}\DevExpress.Utils.v11.1.dll" %windir%\assembly\GAC_MSIL\DevExpress.Utils.v11.1\11.1.6.0__b88d1754d700e49a

gacutil -u "{INSTALL_PATH}\DevExpress.CodeRush.Common"
mkdir %windir%\assembly\GAC_MSIL\DevExpress.CodeRush.Common\11.1.6.0__35c9f04b7764aa3d
copy "{INSTALL_PATH}\DevExpress.CodeRush.Common.dll" %windir%\assembly\GAC_MSIL\DevExpress.CodeRush.Common\11.1.6.0__35c9f04b7764aa3d
REM copy "{INSTALL_PATH}\DevExpress.CodeRush.Common.dll" "C:\Program Files\DevExpress 2011.1\IDETools\System\DXCore\BIN\DevExpress.CodeRush.Common.dll"
if "[%ProgramFiles(x86)%]" == "[]" (copy "{INSTALL_PATH}\DevExpress.CodeRush.Common.dll" "%ProgramFiles%\DevExpress 2011.1\IDETools\System\DXCore\BIN\DevExpress.CodeRush.Common.dll") else (copy "{INSTALL_PATH}\DevExpress.CodeRush.Common.dll" "%ProgramFiles(x86)%\DevExpress 2011.1\IDETools\System\DXCore\BIN\DevExpress.CodeRush.Common.dll")

echo 'OK'
pause

2、創建一個安裝包后,並增加一個自定義安裝項目,命名為InstallerAction項目,然后創建一個“安裝程序類”,如下所示

項目工程如下:

 

3)然后我們修改“安裝程序類”的代碼,覆蓋Install函數,主要是用來替換Register.bat批處理文件的路徑變量"{INSTALL_PATH}",如下代碼所示

    [RunInstaller(true)]
public partial class InstallAction : Installer
{
public InstallAction()
{
InitializeComponent();
}

public override void Install(IDictionary stateSaver)
{
base.Install(stateSaver);

try
{
string physicalRoot = this.Context.Parameters["targetdir"]; // 安裝物理路徑

try
{
//由於執行Register.bat文件的時候,gacutil.exe會以System目錄作為起始目錄,
//因此在Bat文件中設置一個參數,安裝的時候替換為具體的目錄
string Register = Path.Combine(physicalRoot, "Register.bat");
ReplaceName(Register, "{INSTALL_PATH}", physicalRoot);
}
catch { }

string registerFile = Path.Combine(physicalRoot, "Register.bat");
RunDos(registerFile, "", false);
}
catch (Exception ex)
{
WriteLog(ex.ToString());
}
}

/// <summary>
/// 在運行腳本之前把腳本中的指定名稱替換成新的名詞
/// </summary>
/// <param name="filePath">腳本文件名</param>
/// <param name="oldDBName">原有的名稱</param>
/// <param name="newDBName">新的名稱</param>
private void ReplaceName(string filePath, string oldName, string newName)
{
if (newName.CompareTo(oldName) != 0)
{
string fileText = string.Empty;
using (StreamReader streamReader = new StreamReader(filePath, Encoding.Default))
{
fileText = streamReader.ReadToEnd();
fileText = fileText.Replace(oldName, newName);
}

using (StreamWriter streamWriter = new StreamWriter(filePath, false, Encoding.Default))
{
streamWriter.Write(fileText);
}
}
}

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

4、接着在安裝包的自定義安裝視圖中,把剛才自定義安裝項目關聯到安裝包中,如下所示。

並修改主輸出來自InstallAction的屬性項目如下所示

5、編譯運行程序,我們發現DOS運行的效果如下所示,說明DOS命令正常運行,並復制了文件。

6、運行程序,DevExpress界面正常出來,並沒有彈出額外的窗體,這真是我們需要的,示例界面如下所示。




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM