DisplayMagician/HeliosPlus/InterProcess/IPCService.cs
2020-05-15 23:25:14 +12:00

72 lines
1.8 KiB
C#

using System;
using System.Diagnostics;
using System.ServiceModel;
using System.Windows.Forms;
namespace HeliosPlus.InterProcess
{
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
internal class IPCService : IService
{
private static ServiceHost _serviceHost;
private IPCService()
{
Status = InstanceStatus.Busy;
}
public int HoldProcessId { get; set; } = 0;
public InstanceStatus Status { get; set; }
public void StopHold()
{
Application.Exit();
}
public static IPCService GetInstance()
{
if (_serviceHost != null || StartService())
{
return _serviceHost?.SingletonInstance as IPCService;
}
return null;
}
public static bool StartService()
{
if (_serviceHost == null)
{
try
{
var process = Process.GetCurrentProcess();
var service = new IPCService();
_serviceHost = new ServiceHost(
service,
new Uri($"net.pipe://localhost/HeliosPlus_IPC{process.Id}"));
_serviceHost.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "Service");
_serviceHost.Open();
return true;
}
catch (Exception)
{
try
{
_serviceHost?.Close();
}
catch
{
// ignored
}
_serviceHost = null;
}
}
return false;
}
}
}