• silverlight 4.0 的oob模式下,调用com通过wmi重启自身进程 killself


    silverlight目前开发的应用,想做到系统内注销后自动重新启动下 sllauncher.exe ,实现方式是通过WMI的COM接口,获取到当前应用的执行命令行(CommandLine);并通过shell运行;代码如下:

    #region Using Section
    
    using System;
    using System.Collections.Generic;
    using System.Runtime.InteropServices.Automation;
    using System.Windows;
    
    #endregion
    
    namespace KillSelf
    {
        public class ComObjectHelper
        {
            private static List<string> GetProcess()
            {
                var result = new List<string>();
                try
                {
                    dynamic objLocator = AutomationFactory.CreateObject("WbemScripting.SWbemLocator");
                   
                    dynamic objWmiService = objLocator.ConnectServer(".", "root\cimv2");
    
                    dynamic query =
                        objWmiService.ExecQuery("Select * from Win32_Process");
    
                    foreach (dynamic o in query)
                    {
                        //string value = "ExecutablePath = " + o.CommandLine + "
    ";
                        //Console.WriteLine(value);
    
                        result.Add(o.CommandLine + "");
                    }
    
                    return result;
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Get Process:" + ex.Message);
                }
                return null;
            }
    
            internal static void Exec(string cmdline)
            {
                try
                {
                    dynamic cmd = AutomationFactory.CreateObject("WScript.Shell");
                    cmd.Run(cmdline, 1, false);
                }
                catch (Exception ex)
                {
                    MessageBox.Show("Execute Process:" + ex.Message);
                }
            }
    
            public static SlProcess GetSelf()
            {
                string[] procs = GetProcess().ToArray();
    
                foreach (string p in procs)
                {
                    string cmdline = p.ToLower();
                    if (cmdline.IndexOf("sllauncher.exe", StringComparison.Ordinal) != -1)
                    {
                        return new SlProcess(cmdline);
                    }
                }
                throw new NullReferenceException("未找到SLLauncher.exe进程");
            }
        }
    
        public class SlProcess
        {
            public SlProcess(string cmdline)
            {
                CommandLine = cmdline;
            }
    
            public string CommandLine { get; set; }
    
            public SlProcess Run()
            {
                ComObjectHelper.Exec(CommandLine);
                return this;
            }
    
            public SlProcess Kill()
            {
                Application.Current.MainWindow.Close();
                return this;
            }
        }
    }

    调用部分:

            private void Button_Click(object sender, RoutedEventArgs e)
            {
                if (!Application.Current.IsRunningOutOfBrowser)
                {
                    MessageBox.Show("Not Running OutOfBrowser!!");
                    return;
                }
                
                ComObjectHelper.GetSelf().Run().Kill();
            }
    
  • 相关阅读:
    maven 常用命令
    navicat 破解
    linux命令
    Git常用命令
    关于近期工作的总结
    ES6新特性学习
    Hadoop初步学习
    串行、并行与并发的理解
    通过Spring profile方式实现多环境部署
    使用MySQL乐观锁解决超卖问题
  • 原文地址:https://www.cnblogs.com/Chinasf/p/3781348.html
Copyright © 2020-2023  润新知