public void TestSingleInstance() { const string identifier = @"Global\SingleInstance.Test1"; using ISingleInstanceService singleInstance = CreateNewInstance(identifier); Assert.IsFalse(singleInstance.IsFirstInstance); Assert.IsTrue(singleInstance.TryStartSingleInstance()); Assert.IsTrue(singleInstance.IsFirstInstance); using ISingleInstanceService singleInstance2 = CreateNewInstance(identifier); Assert.IsFalse(singleInstance2.TryStartSingleInstance()); Assert.IsFalse(singleInstance2.IsFirstInstance); }
public async Task TestSendMessageToFirstInstanceAsync() { const string identifier = @"Global\SingleInstance.Test2"; const string clientSendStr = @"Hello!"; const string serverResponseStr = @"你好!"; ISingleInstanceService server = CreateNewInstance(identifier); Assert.IsTrue(server.TryStartSingleInstance()); ISingleInstanceService client = CreateNewInstance(identifier); Assert.IsFalse(client.TryStartSingleInstance()); server.StartListenServer(); Assert.ThrowsException <InvalidOperationException>(() => server.StartListenServer()); Assert.ThrowsException <InvalidOperationException>(() => client.StartListenServer()); server.Received.ObserveOn(Scheduler.Default).SelectMany(ServerResponseAsync).Subscribe(); string clientReceive = await client.SendMessageToFirstInstanceAsync(clientSendStr); Assert.AreEqual(serverResponseStr, clientReceive);
public void TestDispose() { const string identifier = @"Global\SingleInstance.Test"; ISingleInstanceService singleInstance = CreateNewInstance(identifier); Assert.IsTrue(singleInstance.TryStartSingleInstance()); ISingleInstanceService singleInstance2 = CreateNewInstance(identifier); Assert.IsFalse(singleInstance2.TryStartSingleInstance()); singleInstance.Dispose(); ISingleInstanceService singleInstance3 = CreateNewInstance(identifier); Assert.IsTrue(singleInstance3.TryStartSingleInstance()); singleInstance2.Dispose(); ISingleInstanceService singleInstance4 = CreateNewInstance(identifier); Assert.IsFalse(singleInstance4.TryStartSingleInstance()); }
public static void Main(string[] args) { // handle arguments if (args.Contains(Constants.Parameter.ForceUpdate)) { Flags.AlwaysShowNewVersionFound = true; } // set working directory Directory.SetCurrentDirectory(Global.NetchDir); // append .\bin to PATH var binPath = Path.Combine(Global.NetchDir, "bin"); Environment.SetEnvironmentVariable("PATH", $"{Environment.GetEnvironmentVariable("PATH")};{binPath}"); #if !DEBUG // check if .\bin directory exists if (!Directory.Exists("bin") || !Directory.EnumerateFileSystemEntries("bin").Any()) { i18N.Load("System"); MessageBoxX.Show(i18N.Translate("Please extract all files then run the program!")); Environment.Exit(2); } #endif // clean up old files Updater.CleanOld(Global.NetchDir); // pre-create directories var directories = new[] { "mode\\Custom", "data", "i18n", "logging" }; foreach (var item in directories) { if (!Directory.Exists(item)) { Directory.CreateDirectory(item); } } // load configuration Configuration.LoadAsync().Wait(); // check if the program is already running if (!SingleInstance.TryStartSingleInstance()) { SingleInstance.SendMessageToFirstInstanceAsync(Constants.Parameter.Show).GetAwaiter().GetResult(); Environment.Exit(0); return; } SingleInstance.Received.Subscribe(SingleInstance_ArgumentsReceived); // clean up old logs if (Directory.Exists("logging")) { var directory = new DirectoryInfo("logging"); foreach (var file in directory.GetFiles()) { file.Delete(); } foreach (var dir in directory.GetDirectories()) { dir.Delete(true); } } InitConsole(); CreateLogger(); // load i18n i18N.Load(Global.Settings.Language); // log environment information LogEnvironmentAsync().Forget(); CheckClr(); CheckOS(); // handle exceptions Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); Application.ThreadException += Application_OnException; Application.ApplicationExit += Application_OnExit; Application.SetHighDpiMode(HighDpiMode.DpiUnawareGdiScaled); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(Global.MainForm); }