zoukankan      html  css  js  c++  java
  • 自制安装程序~单文件~可安装windows服务~技巧!类似安装QQ!

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Threading;
    using System.Xml;
    using System.IO;
    using System.IO.Compression;
    using System.Resources;
    using System.Net;
    using System.Web.Services.Description;
    using System.Diagnostics;
    using System.Runtime.InteropServices;
    
    namespace MON.Client
    {
        public partial class MainForm : Form
        {
            bool testFlag = false;
            Dictionary<string, string> dic;
            Thread t;
            public MainForm()
            {
    
                InitializeComponent();
            }
    
            private void MainForm_Load(object sender, EventArgs e)
            {
                dic = new Dictionary<string, string>();
                groupBox1.Visible = true;
                groupBox2.Visible = false;
            }
    
            /// <summary>
            /// 安装路径
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void InstallPathBTN_Click(object sender, EventArgs e)
            {
                DialogResult dr = FolerBrowserCreator.ShowDialog();
                if (DialogResult.OK == dr)
                {
                    InstallPathTB.Text = FolerBrowserCreator.SelectedPath;
                    if (dic.ContainsKey("installPath"))
                    {
                        dic["installPath"] = InstallPathTB.Text;                    
                    }
                    else
                    {
                        dic.Add("installPath", InstallPathTB.Text);
                    }
                    if (string.IsNullOrEmpty(LogInstallPahtTB.Text))
                    {
                        LogInstallPahtTB.Text = Path.Combine(InstallPathTB.Text, "log");
                        if (dic.ContainsKey("logPath"))
                        {
                            dic["logPath"] = LogInstallPahtTB.Text;                        
                        }
                        else
                        {
                            dic.Add("logPath", LogInstallPahtTB.Text);
                        }
                    }
                }
            }
            /// <summary>
            /// 日志路径
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void LogPathBrowseBtn_Click(object sender, EventArgs e)
            {
                DialogResult dr = FolerBrowserCreator.ShowDialog();
                if (DialogResult.OK == dr)
                {
                    LogInstallPahtTB.Text = FolerBrowserCreator.SelectedPath;
                    if (dic.ContainsKey("logPath"))
                    {
                        dic["logPath"] = LogInstallPahtTB.Text;                    
                    }
                    else
                    {
                        dic.Add("logPath", LogInstallPahtTB.Text);
                    }
                }
            }
            /// <summary>
            /// 测试webservice;
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void testWebServiceBTN_Click(object sender, EventArgs e)
            {
                testWebServiceBTN.Enabled = false;
                TestService();
                if (testFlag)
                {
                    MessageBox.Show("测试通过", "系统提示", MessageBoxButtons.OK);
                }
                else
                {
                    MessageBox.Show("网站地址有误", "系统提示", MessageBoxButtons.OK);
                }
                testWebServiceBTN.Enabled = true;
            }
            /// <summary>
            /// 测试webservice
            /// </summary>
            void TestService()
            {
                WebClient wc = new WebClient();
                Stream stream1 = null;
                Stream stream2 = null;
                try
                {
                    var url = WebSiteTB.Text.Trim().ToUpper();
                    if (!url.EndsWith("/MON/MONSERVICE.ASMX"))
                    {
                        url = url.TrimEnd('/') + "/MON/MONSERVICE.ASMX";
                    }
                    if (dic.ContainsKey("webService"))
                    {
                        dic["webService"] = url;
                    }
                    else
                    {
                        dic.Add("webService", url);
                    }
                    stream1 = wc.OpenRead(url + "?op=GetMachineConfig");
                    stream2 = wc.OpenRead(url + "?op=UpdateServerStatus");
                    if (stream1.CanRead && stream2.CanRead)
                    {
                        testFlag = true;
                    }
                }
                catch
                {
                    testFlag = false;
                }
                finally
                {
                    wc.Dispose();
                    if (stream1 != null)
                    {
                        stream1.Close();
                    }
                    if (stream2 != null)
                    {
                        stream2.Close();
                    }
    
                }
            }
            /// <summary>
            /// 开始安装
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void StartBtn_Click(object sender, EventArgs e)
            {
                if (!Directory.Exists(InstallPathTB.Text.Trim()))
                {
                    MessageBox.Show("安装路径有误", "系统提示", MessageBoxButtons.OK);
                    return;
                }
    
                if (LogInstallPahtTB.Text.Trim().StartsWith(InstallPathTB.Text.Trim()))
                {
                    if (!Directory.Exists(LogInstallPahtTB.Text.Trim()))
                    {
                        Directory.CreateDirectory(LogInstallPahtTB.Text.Trim());
                    }
                }
                else
                {
                    if (!Directory.Exists(LogInstallPahtTB.Text.Trim()))
                    {
                        MessageBox.Show("日志路径有误", "系统提示", MessageBoxButtons.OK);
                        return;
                    }
                }
                if (testFlag == false)
                {
                    TestService();//test过就不用再test一次了
                }
                if (testFlag == false)
                {
                    MessageBox.Show("网站地址有误", "系统提示", MessageBoxButtons.OK);
                    return;
                }
                try
                {
                    int days = Convert.ToInt32(DaysTB.Text.Trim());
                    if (days < 1)
                    {
                        throw new Exception();
                    }
                }
                catch
                {
                    MessageBox.Show("日志保存天数有误", "系统提示", MessageBoxButtons.OK);
                    return;
                }
                dic.Add("logDays", DaysTB.Text.Trim());
                groupBox1.Visible = false;
                groupBox2.Visible = true;
                InstallInfoTB.Text = "开始安装";
                t = new Thread(new ThreadStart(InstallJob));
                t.Start();
            }
            /// <summary>
            /// 安装线程
            /// </summary>
            void InstallJob()
            {
                WriteLine("准备安装环境...");
                var configPath = Path.Combine(dic["installPath"], "MON.WS.exe.config");
                var exePath = configPath.TrimEnd(".config".ToCharArray());
                var args = new List<string>();
    
                args.Add(@"net stop 服务器性能监控UTRY");
                args.Add(@"%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe /u " + exePath);
                args.Add("exit");
                if (!cmdCommand(args))
                {
                    WriteLine("在卸载原有服务时出现异常");
                    WriteLine("安装失败");
                    return;
                }
    
                WriteLine("释放配置文件...");
                if (!releaseConfig(dic, configPath))
                {
                    WriteLine("释放配置文件过程中出现异常");
                    WriteLine("安装失败");
                    return;
                }
                WriteLine("配置文件释放完毕...");
    
                WriteLine("释放可执行文件...");
                if (!releaseExe(exePath))
                {
                    WriteLine("释放可执行文件时出现异常");
                    WriteLine("安装失败");
                    return;
                }
                WriteLine("可执行文件释放完毕...");
    
                WriteLine("开始安装服务...");
                args.Clear();
                args.Add(@"%SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe " + exePath);
                args.Add(@"net start 服务器性能监控UTRY");
                args.Add("exit");
                if (!cmdCommand(args))
                {
                    WriteLine("在安装和启动服务时出现异常");
                    WriteLine("安装失败");
                    return;
                }
                WriteLine("服务安装成功");
                WriteLine("安装成功");
            }
            /// <summary>
            /// 释放exe
            /// </summary>
            /// <param name="exePath"></param>
            bool releaseExe(string exePath)
            {
                try
                {
                    var data = Properties.Resources.MON_WS;
                    if (File.Exists(exePath))
                    {
                        File.Delete(exePath);
                    }
                    var f = new FileStream(exePath, FileMode.Create);
                    f.Write(data, 0, data.Length);
                    f.Close();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            /// <summary>
            /// 释放Config
            /// </summary>
            /// <param name="dic"></param>
            /// <param name="configPath"></param>
            bool releaseConfig(Dictionary<string, string> dic, string configPath)
            {
                try
                {
                    var configStr = Properties.Resources.MON_WS_exe;
                    WriteLine("配置相关信息...");
                    configStr = configStr.Replace("#WebServiceUrl#", dic["webService"]);
                    configStr = configStr.Replace("#LogSavePath#", dic["logPath"]);
                    configStr = configStr.Replace("#LogSaveDays#", dic["logDays"]);
                    if (File.Exists(configPath))
                    {
                        File.Delete(configPath);
                    }
                    StreamWriter sw = File.AppendText(configPath);
                    sw.Write(configStr);
                    sw.Flush();
                    sw.Close();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            /// <summary>
            /// 执行CMD命令
            /// </summary>
            /// <param name="args"></param>
            bool cmdCommand(List<string> args)
            {
                try
                {
                    var process = new Process();
                    process.StartInfo.FileName = "cmd";
                    process.StartInfo.UseShellExecute = false;
                    process.StartInfo.RedirectStandardInput = true;
                    process.StartInfo.RedirectStandardOutput = true;
                    process.StartInfo.CreateNoWindow = true;
                    process.Start();
                    foreach (var arg in args)
                    {
                        process.StandardInput.WriteLine(arg);
                    }
                    process.WaitForExit();
                    //var result = process.StandardOutput.ReadToEnd();
                    process.Close();
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            delegate void mydele(string text);
            /// <summary>
            /// 更新安装信息
            /// </summary>
            /// <param name="text"></param>
            void WriteLine(string text)
            {
                if (InstallInfoTB.InvokeRequired)
                {
                    mydele dd = new mydele(WriteLine);
                    InstallInfoTB.BeginInvoke(dd, new object[] { text });
                }
                else
                {
                    InstallInfoTB.Text = InstallInfoTB.Text + Environment.NewLine + text;
                    if (text == "安装成功"||text == "安装失败")
                    {
                        CompleteBTN.Enabled = true;
                    }
                }
            }
            /// <summary>
            /// 取消
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void CancelBTN_Click(object sender, EventArgs e)
            {
                this.Close();
            }
            /// <summary>
            /// 完成
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void CompleteBTN_Click(object sender, EventArgs e)
            {
                if (t != null)
                {
                    t.Abort();
                    t.Join();
                }
                this.Close();
            }
        }
    }
    
  • 相关阅读:
    函数名的应用/列表推导式
    装饰器/内置函数
    函数的基础
    文件的改的操作
    常用str
    python 定时器 timer QTimer
    Python 2.7.16 pyinstaller3.0 生成exe可执行文件
    python 根据excel单元格内容获取该单元格所在的行号
    python 实现仪器LAN口通信(FLUKE 8846)
    VS2019 MSB8041 MSB8042 Error
  • 原文地址:https://www.cnblogs.com/liulun/p/2246431.html
Copyright © 2011-2022 走看看