http://www.sufeinet.com/plugin.php?id=keke_group

苏飞论坛

 找回密码
 马上注册

QQ登录

只需一步,快速开始

分布式系统框架(V2.0) 轻松承载百亿数据,千万流量!讨论专区 - 源码下载 - 官方教程

HttpHelper爬虫框架(V2.7-含.netcore) HttpHelper官方出品,爬虫框架讨论区 - 源码下载 - 在线测试和代码生成

HttpHelper爬虫类(V2.0) 开源的爬虫类,支持多种模式和属性 源码 - 代码生成器 - 讨论区 - 教程- 例子

查看: 10609|回复: 4

[C#语言基础] 用WindowsInstaller打包第三方软件如MySql

[复制链接]
发表于 2013-11-15 13:46:13 | 显示全部楼层 |阅读模式
创建WindowsInstaller打包程序这里就不做解说了,网上一搜一大堆,咱就说下关于如何将第三方的程序打入到安装包中。
思路:
WindowsInstaller打包成msi是可以用rar之类的工具打开的,说白了就是将源文件进行打包压缩成msi特有格式,只不过有个引到过程。
安装之后就相当于对msi的解压。说这些有什么用呢,这就涉及到MySql打包了。
我的做法:
1.安装好MySql后,找到源文件,将其复制到部署程序的文件系统中,看好了,是源文件,如我安装的路径是C:\Program Files\MySQL\MySQL Server 5.5,那么就将这下面的所有文件都拷贝到文件系统中。
2.通过代码来实现某些功能,我们可以把msi看成特殊的rar文件,只不过点击后安装就解压好了,那么就用代码将源文件拷贝到别的目录下,一般情况将MySql安装到C盘,那就拷贝到C盘,并且通过代码进行服务注册,开启服务等等。如有环境变量等也可设置环境变量。
步骤:
1.创建类库并创建安装程程序类,继承System.Configuration.Install.Installer如:
[RunInstaller(true)]
    public partial class InstallerMySql : System.Configuration.Install.Installer

2.重写Install或者OnAfterInstall方法,都可以。
3.在OnAfterInstall方法中实现代码部分。
4.在打包部署项目中添加该类库的输出。
5.在自定义操作的安装处添加自定义操作(打包部署项目右键-视图-自定义操作),选择该类库的主输出。
6.在刚添加的自定义操作右键属性中的CustomActionData写上/tardir="[TARGETDIR]/"这个表示安装程序的路径方便后台获取。
关键代码:
[C#] 纯文本查看 复制代码
protected override void OnAfterInstall(IDictionary savedState)
        {
            var path = Context.Parameters["tardir"];
            _setUpPath = path.Substring(0, path.Length - 2);
            #region 安装MySql
            //安装MySql
            if (!IsExitMySql())//判断MySql服务是否存在
            {
                CreatePath(_mySqlPath);//创建MySql路径
                CopyFile(_setUpPath + "\\MySQL Server 5.5", _mySqlPath);//拷贝文件
                InstallMySqlService(_mySqlPath);//注册MySql服务
                StartMySqlService();//启动MySql服务
            }
            #endregion
             base.OnAfterInstall(savedState);
        }

/// <summary>
        /// 是否存在MySql
        /// </summary>
        /// <returns>true存在,false不存在</returns>
        private bool IsExitMySql()
        {
            ServiceController[] serviceController = System.ServiceProcess.ServiceController.GetServices();//根据服务名称获取目标机器服务
            foreach (ServiceController item in serviceController)
            {
                //判断服务是否存在名为MySQL的服务
                if (item.ServiceName == "MySQL")
                {
                    return true;
                }
            }
            return false;
        }
/// <summary>
        /// 创建目标目录
        /// <param name="path">目标目录</param>
        /// </summary>
        private void CreatePath(string path)
        {
            //判断目录是否存在
            if (!Directory.Exists(path))
            {
                string[] newPath = path.Split('\\');
                string temp = string.Empty;
                for (int i = 0; i < newPath.Length; i++)
                {
                    temp += newPath.Trim() + "\\";
                    //循环创建不存在的目录
                    if (!Directory.Exists(temp))
                        Directory.CreateDirectory(temp);
                }
            }
        }

/// <summary>
        /// 拷贝文件到目标目录
        /// <param name="sourcePath">源路径</param>
        /// <param name="targetPath">目标路径</param>
        /// </summary>
        private void CopyFile(string sourcePath, string targetPath)
        {
            //如果目标路径不存在则创建目录
            if (!Directory.Exists(targetPath))
            {
                CreatePath(targetPath);
            }
            string[] files = Directory.GetFiles(sourcePath);
            for (int i = 0; i < files.Length; i++)
            {
                string[] childFiles = files.Split('\\');
                File.Copy(files, targetPath + @"\" + childFiles[childFiles.Length - 1], true);
            }

            string[] directories = Directory.GetDirectories(sourcePath);
            for (int i = 0; i < directories.Length; i++)
            {
                string[] childDirectories = directories.Split('\\');
                CopyFile(directories, targetPath + @"\" + childDirectories[childDirectories.Length - 1]);
            }
        }


/// <summary>
        /// 安装并启动MySql服务
        /// <param name="mySqlPath">MySql路径</param>
        /// </summary>
        private void InstallMySqlService(string mySqlPath)
        {
            try
            {
                Process process = new Process();
                process.StartInfo.FileName = "cmd.exe";
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardInput = true;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;
                process.StartInfo.CreateNoWindow = true;
                process.Start();
                process.StandardInput.WriteLine("");
                process.StandardInput.WriteLine("cd" + " " + mySqlPath + "\\bin");
                process.StandardInput.WriteLine("mysqld --install MySQL --defaults-file=" + '"' + mySqlPath + "\\my.ini" + '"');//注册MySQL服务
                Thread.Sleep(2000);
                process.Dispose();
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message, "注册MySql服务出错");
            }
        }

        /// <summary>
        /// 启动MySql服务
        /// </summary>
        private void StartMySqlService()
        {
            try
            {
                Process process = new Process();
                process.StartInfo.FileName = "cmd.exe";
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardInput = true;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardError = true;
                process.StartInfo.CreateNoWindow = true;
                process.Start();
                //启动MySql服务
                process.StandardInput.WriteLine("net start mysql");
                Thread.Sleep(3000);
                process.Dispose();
            }
            catch (Exception exception)
            {
                MessageBox.Show(exception.Message,"启动MySql服务出错");
            }
        }

自此可以生成测试了。如有错误欢迎提出。


1. 开通SVIP会员,免费下载本站所有源码,不限次数据,不限时间
2. 加官方QQ群,加官方微信群获取更多资源和帮助
3. 找站长苏飞做网站、商城、CRM、小程序、App、爬虫相关、项目外包等点这里
发表于 2013-11-15 14:15:15 | 显示全部楼层
我只是路过看看的。
 楼主| 发表于 2013-11-15 16:12:14 | 显示全部楼层
好吧,我知道站长不是有意抢沙发的。
发表于 2013-11-15 16:23:41 | 显示全部楼层
我也在学习打包..
发表于 2014-4-15 16:52:24 | 显示全部楼层
这样的话,mysql的用户名怎么设置呢?
您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|小黑屋|手机版|联系我们|关于我们|广告合作|苏飞论坛 ( 豫ICP备18043678号-2)

GMT+8, 2024-12-19 13:11

© 2014-2021

快速回复 返回顶部 返回列表