zoukankan      html  css  js  c++  java
  • 如何在安装过程中部署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界面正常出来,并没有弹出额外的窗体,这真是我们需要的,示例界面如下所示。



    主要研究技术:代码生成工具、Visio二次开发、送水管理软件等共享软件开发
    专注于Winform开发框架、WCF开发框架的研究及应用。
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    sublime text 4 vim 插件配置
    ssh-keygen 的使用
    distribution transaction solution
    bilibili 大数据 视频下载 you-get
    Deepin 20.2.1 安装 MS SQL 2019 容器版本
    【转】使用Linux下Docker部署MSSQL并加载主机目录下的数据库
    【转】You Can Now Use OneDrive in Linux Natively Thanks to Insync
    dotnet 诊断工具安装命令
    Linux 使用 xrandr 设置屏幕分辨率
    【转】CentOS 7.9 2009 ISO 官方原版镜像下载
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2350663.html
Copyright © 2011-2022 走看看