using System; using System.Globalization; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; namespace HashCalculator.GUI { public static class Program { [STAThread] public static void Main() { try { AppDomain.CurrentDomain.AssemblyResolve += OnResolveAssembly; App.Main(); } catch(Exception exception) { ErrorBox($"发生了无法处理的错误:\r\n{exception}\r\n可以尝试在百度红警3吧联系岚依"); throw; } } private static Assembly OnResolveAssembly(object? sender, ResolveEventArgs args) { var executingAssembly = Assembly.GetExecutingAssembly(); var assemblyName = new AssemblyName(args.Name); var nameString = assemblyName.Name ?? throw new InvalidOperationException("Assembly does not have an name"); var paths = new[] { $"{nameString}.dll" }.AsEnumerable(); const string resourceExtenstion = ".resources"; if (nameString.EndsWith(resourceExtenstion, StringComparison.OrdinalIgnoreCase)) { paths = paths.Append(nameString.Insert(nameString.Length - resourceExtenstion.Length, ".g")); } if (!Equals(assemblyName.CultureInfo, CultureInfo.InvariantCulture)) { paths = paths.Select(x => $"{assemblyName.CultureInfo}\\{x}").Concat(paths); } foreach(var path in paths) { using var stream = executingAssembly.GetManifestResourceStream(path); if (stream == null) { continue; } using (stream) { var assemblyRawBytes = new byte[stream.Length]; stream.Read(assemblyRawBytes, 0, assemblyRawBytes.Length); return Assembly.Load(assemblyRawBytes); } } var errorMessage = $"Failed to load assembly {nameString}"; throw new ApplicationException(errorMessage); } public static void ErrorBox(string text) { _ = NativeMethods.MessageBox(IntPtr.Zero, text, null, 0x00000010L); } } internal static class NativeMethods { [DllImport("User32.dll", CallingConvention = CallingConvention.Winapi, CharSet = CharSet.Unicode)] public static extern int MessageBox(IntPtr hWnd, string lpText, string? lpCaption, ulong uType); } }