76 lines
2.5 KiB
C#
76 lines
2.5 KiB
C#
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.ToString()}\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;
|
|
|
|
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 (!assemblyName.CultureInfo.Equals(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);
|
|
}
|
|
}
|