using System; using System.Diagnostics; using System.IO; using System.Threading; using System.Windows.Forms; using Shadowsocks.Controller; using Shadowsocks.Util; using Shadowsocks.View; namespace Shadowsocks { static class Program { /// /// 应用程序的主入口点。 /// [STAThread] static void Main() { Utils.ReleaseMemory(true); using (Mutex mutex = new Mutex(false, "Global\\Shadowsocks_" + Application.StartupPath.GetHashCode())) { AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); if (!mutex.WaitOne(0, false)) { Process[] oldProcesses = Process.GetProcessesByName("Shadowsocks"); if (oldProcesses.Length > 0) { Process oldProcess = oldProcesses[0]; } MessageBox.Show(I18N.GetString("Find Shadowsocks icon in your notify tray.") + "\n" + I18N.GetString("If you want to start multiple Shadowsocks, make a copy in another directory."), I18N.GetString("Shadowsocks is already running.")); return; } Directory.SetCurrentDirectory(Application.StartupPath); #if DEBUG Logging.OpenLogFile(); // truncate privoxy log file while debugging string privoxyLogFilename = Utils.GetTempPath("privoxy.log"); if (File.Exists(privoxyLogFilename)) using (new FileStream(privoxyLogFilename, FileMode.Truncate)) { } #else Logging.OpenLogFile(); #endif ShadowsocksController controller = new ShadowsocksController(); MenuViewController viewController = new MenuViewController(controller); controller.Start(); Application.Run(); } } private static int exited = 0; private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { if (Interlocked.Increment(ref exited) == 1) { Logging.Error(e.ExceptionObject?.ToString()); MessageBox.Show(I18N.GetString("Unexpect error, shadowsocks will be exit. Please report to") + " https://github.com/shadowsocks/shadowsocks-windows/issues " + Environment.NewLine + (e.ExceptionObject?.ToString()), "Shadowsocks Error", MessageBoxButtons.OK, MessageBoxIcon.Error); Application.Exit(); } } } }