public void Kill_WhenCalled_TerminatesProcess() { var startInfo = new ProcessStartInfo("timeout") { Arguments = "1000", // seconds UseShellExecute = true, CreateNoWindow = true, WindowStyle = ProcessWindowStyle.Hidden }; using (var exitedEvent = new ManualResetEventSlim(initialState: false)) using (var pluginProcess = new PluginProcess(startInfo)) { pluginProcess.Exited += (object sender, IPluginProcess e) => { exitedEvent.Set(); }; pluginProcess.Start(); pluginProcess.Kill(); exitedEvent.Wait(); Assert.NotNull(pluginProcess.ExitCode); } }
private static void TestWithUnstartedProcess(Action <PluginProcess> verify) { using (var pluginProcess = new PluginProcess(new ProcessStartInfo())) { verify(pluginProcess); } }
public static JavaScriptPlugin CreateFromType(PluginProcess pluginProcess, Type type, bool isKernel) { if (type == null) { return(null); } var pluginAttr = type.GetCustomAttributes(typeof(JavaScriptPluginAttribute), true); if (pluginAttr.Length == 0) { return(null); } var pAttr = pluginAttr[0] as JavaScriptPluginAttribute; if (pAttr == null) { return(null); } if (isKernel && ((pluginProcess == PluginProcess.Browser && !pAttr.IsBrowserSide) || (pluginProcess == PluginProcess.Renderer && pAttr.IsBrowserSide))) { return(null); } var plugin = new JavaScriptPlugin(pluginProcess, Activator.CreateInstance(type), pAttr); return(plugin.IsValid ? plugin : null); }
private JavaScriptPlugin(PluginProcess pluginProcess, object plugin, JavaScriptPluginAttribute pluginAttribute) { NativeObject = plugin; _pluginId = pluginAttribute.Name; _callbackThread = pluginAttribute.CallbackThread; if (string.IsNullOrEmpty(_pluginId)) { _isDynamic = true; _pluginId = Guid.NewGuid().ToString(); } var pluginType = NativeObject.GetType(); _methods = new ConcurrentDictionary <string, MethodInfo>( GetParagonMembers(pluginType.GetMethods)); _events = new ConcurrentDictionary <string, JavaScriptEvent>(GetParagonMembers(pluginType.GetEvents) .Where(m => m.Value.EventHandlerType == typeof(JavaScriptPluginCallback)) .ToDictionary(m => m.Key, m => new JavaScriptEvent(NativeObject, m.Value))); _properties = new ConcurrentDictionary <string, PropertyInfo>(GetParagonMembers(pluginType.GetProperties)); if (_isDynamic) { var disposedEvent = pluginType .GetEvents(BindingFlags.Instance | BindingFlags.Public) .FirstOrDefault(e => { var a = e.GetCustomAttributes(typeof(JavaScriptDisposeAttribute), true); return(a.Length > 0); }); if (disposedEvent != null && disposedEvent.EventHandlerType == typeof(JavaScriptPluginCallback)) { _disposedEvent = disposedEvent; _disposedHandler = OnNativeObjectDisposed; _disposedEvent.AddEventHandler(NativeObject, _disposedHandler); } } foreach (var nativeEvent in _events.Values) { nativeEvent.AttachToEvent(); } Descriptor = new PluginDescriptor { PluginId = _pluginId, Methods = _methods.Select(method => new MethodDescriptor { MethodName = method.Key, HasCallbackParameter = HasCallbackParameter(method.Value), IsVoid = method.Value.ReturnType == typeof(void) }).ToList(), Events = _events.Keys.ToList() }; }
/// <nodoc /> public void Kill() { if (PluginProcess != null && !PluginProcess.HasExited && !PluginProcess.WaitForExit(milliseconds: 1000)) { PluginProcess.Kill(); PluginProcess.WaitForExit(3000); } }
private static void TestWithRunningProcess(Action <Process, PluginProcess> verify) { using (var process = Process.GetCurrentProcess()) using (var pluginProcess = new PluginProcess()) { verify(process, pluginProcess); } }
private static void TestWithExitedProcess(Action <PluginProcess> verify) { ProcessStartInfo startInfo = CreateProcessStartInfo(); using (var pluginProcess = new PluginProcess(startInfo)) { pluginProcess.Start(); pluginProcess.Kill(); verify(pluginProcess); } }
public static JavaScriptPlugin CreateFromObject(PluginProcess pluginProcess, object plugin) { if (plugin == null) { return(null); } var type = plugin.GetType(); var pluginAttr = type.GetCustomAttributes(typeof(JavaScriptPluginAttribute), true); if (pluginAttr.Length == 0) { return(null); } return(new JavaScriptPlugin(pluginProcess, plugin, pluginAttr[0] as JavaScriptPluginAttribute)); }
/// <nodoc /> public void Dispose() { if (!m_disposed) { PluginClient.Dispose(); if (PluginProcess != null) { if (!PluginProcess.HasExited) { Kill(); } PluginProcess.Exited -= HandleProcessExisted; PluginProcess.Dispose(); } else if (PluginTask != null && !PluginTask.IsCompleted) { PluginTaskCancellationTokenSource.Cancel(); } m_disposed = true; } }
public void Exited_WhenProcessExits_Fires() { ProcessStartInfo startInfo = CreateProcessStartInfo(); using (var exitedEvent = new ManualResetEventSlim(initialState: false)) using (var pluginProcess = new PluginProcess(startInfo)) { IPluginProcess argument = null; pluginProcess.Exited += (object sender, IPluginProcess e) => { argument = e; exitedEvent.Set(); }; pluginProcess.Start(); exitedEvent.Wait(); Assert.Same(pluginProcess, argument); } }
public PluginManager(PluginProcess managerProcess) { _managerProcess = managerProcess; }