HashCalculator.GUI/Program.cs
2022-01-25 13:35:00 +01:00

76 lines
2.6 KiB
C#

using System;
using System.Diagnostics;
using System.Globalization;
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) when (!Debugger.IsAttached)
{
ErrorBox($"发生了无法处理的错误:\r\n{exception}\r\n可以尝试在百度红警3吧联系岚依");
}
}
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);
}
}