创建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服务出错");
}
}
自此可以生成测试了。如有错误欢迎提出。
|