silverlight目前开发的应用,想做到系统内注销后自动重新启动下 sllauncher.exe ,实现方式是通过WMI的COM接口,获取到当前应用的执行命令行(CommandLine);并通过shell运行;代码如下:
#region Using Sectionusing 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 + "\r\n";
//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;
}
}
}
调用部分:
?
1 2 3 4 5 6 7 8 9 10 |
|
silverlight 的oob模式下,重启自身进程 killself,布布扣,bubuko.com