using System; using System.Diagnostics; using System.Reflection; using System.Threading; using System.Windows.Forms; using v2rayN.Forms; using v2rayN.Properties; using v2rayN.Tool; namespace v2rayN { static class Program { [System.Runtime.InteropServices.DllImport("user32.dll")] private static extern bool SetProcessDPIAware(); /// /// 应用程序的主入口点。 /// [STAThread] static void Main() { if (Environment.OSVersion.Version.Major >= 6) { SetProcessDPIAware(); } Application.SetUnhandledExceptionMode(UnhandledExceptionMode.CatchException); Application.ThreadException += new System.Threading.ThreadExceptionEventHandler(Application_ThreadException); AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException); //AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; Thread.Sleep(300); // 尽量避免切换语言后提示“已经运行” Process instance = RunningInstance(); if (instance == null) { if (!UnzipLibs()) { UI.Show($"Error preparing the environment(准备运行环境出错)"); return; } Utils.SaveLog("v2rayN start up " + Utils.GetVersion()); //设置语言环境 string lang = Utils.RegReadValue(Global.MyRegPath, Global.MyRegKeyLanguage, "zh-Hans"); System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang); Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } else { UI.Show($"v2rayN is already running(v2rayN已经运行)"); } } //private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) //{ // try // { // string resourceName = "v2rayN.LIB." + new AssemblyName(args.Name).Name + ".dll"; // using (var stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) // { // if (stream == null) // { // return null; // } // byte[] assemblyData = new byte[stream.Length]; // stream.Read(assemblyData, 0, assemblyData.Length); // return Assembly.Load(assemblyData); // } // } // catch // { // return null; // } //} /// /// 获取正在运行的实例,没有运行的实例返回null; /// public static Process RunningInstance() { Process current = Process.GetCurrentProcess(); Process[] processes = Process.GetProcessesByName(current.ProcessName); foreach (Process process in processes) { if (process.Id != current.Id) { if (Assembly.GetExecutingAssembly().Location.Replace("/", "\\") == process.MainModule.FileName) { return process; } } } return null; } static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e) { Utils.SaveLog("Application_ThreadException", e.Exception); } static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) { Utils.SaveLog("CurrentDomain_UnhandledException", (Exception)e.ExceptionObject); } static bool UnzipLibs() { var fileName = Utils.GetPath("libs.zip"); if (!FileManager.ByteArrayToFile(fileName, Resources.libs)) { return false; } if (!FileManager.ZipExtractToFile(fileName)) { return false; } return true; } } }