zoukankan      html  css  js  c++  java
  • 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();
    }


    主要研究技术:代码生成工具、会员管理系统、客户关系管理软件、病人资料管理软件、Visio二次开发、酒店管理系统、仓库管理系统等共享软件开发
    专注于Winform开发框架/混合式开发框架Web开发框架Bootstrap开发框架微信门户开发框架的研究及应用
      转载请注明出处:
    撰写人:伍华聪  http://www.iqidi.com 
        
  • 相关阅读:
    在CentOS7上安装MySQL5.7-YUM源方式
    自动重建索引
    Oracle EM12c 安装
    CentOS 7 安装oracle 11G
    oracle 11.2.0.4 dbca创建数据库时 报错ORA-12532
    CentOS 7 安装oracle 11.2.0.4 Error in invoking target 'agent nmhs' of makefile
    Oracle db file parallel write 和 log file parallel write 等待事件
    转:ORA-15186: ASMLIB error function = [asm_open], error = [1], 2009-05-24 13:57:38
    笔记:Memory Notification: Library Cache Object loaded into SGA
    Oracle补全日志(Supplemental logging)
  • 原文地址:https://www.cnblogs.com/wuhuacong/p/971864.html
Copyright © 2011-2022 走看看