Esempio n. 1
0
    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);
    }
Esempio n. 2
0
    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);
Esempio n. 3
0
    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());
    }
Esempio n. 4
0
    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);
    }