mirror of
https://github.com/MewoLab/AquaDX.git
synced 2026-02-13 09:27:59 +08:00
[RF] AquaMai configuration refactor (#82)
更新了配置文件格式,原有的配置文件将被自动无缝迁移,详情请见新的配置文件中的注释(例外:`SlideJudgeTweak` 不再默认启用) 旧配置文件将被重命名备份,如果更新到此版本遇到 Bug 请联系我们 Updated configuration file schema. The old config file will be migrated automatically and seamlessly. See the comments in the new configuration file for details. (Except for `SlideJudgeTweak` is no longer enabled by default) Your old configuration file will be renamed as a backup. If you encounter any bug with this version, please contact us.
This commit is contained in:
@@ -0,0 +1,68 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Mono.Cecil;
|
||||
|
||||
namespace AquaMai.Config.HeadlessLoader;
|
||||
|
||||
class ConfigAssemblyLoader
|
||||
{
|
||||
public static Assembly LoadConfigAssembly(AssemblyDefinition assembly)
|
||||
{
|
||||
var references = assembly.MainModule.AssemblyReferences;
|
||||
foreach (var reference in references)
|
||||
{
|
||||
if (reference.Name == "mscorlib" || reference.Name == "System" || reference.Name.StartsWith("System."))
|
||||
{
|
||||
reference.Name = "netstandard";
|
||||
reference.Version = new Version(2, 0, 0, 0);
|
||||
reference.PublicKeyToken = null;
|
||||
}
|
||||
}
|
||||
|
||||
var targetFrameworkAttribute = assembly.CustomAttributes.FirstOrDefault(attr => attr.AttributeType.Name == "TargetFrameworkAttribute");
|
||||
if (targetFrameworkAttribute != null)
|
||||
{
|
||||
targetFrameworkAttribute.ConstructorArguments.Clear();
|
||||
targetFrameworkAttribute.ConstructorArguments.Add(new CustomAttributeArgument(
|
||||
assembly.MainModule.TypeSystem.String, ".NETStandard,Version=v2.0"));
|
||||
targetFrameworkAttribute.Properties.Clear();
|
||||
targetFrameworkAttribute.Properties.Add(new Mono.Cecil.CustomAttributeNamedArgument(
|
||||
"FrameworkDisplayName", new CustomAttributeArgument(assembly.MainModule.TypeSystem.String, ".NET Standard 2.0")));
|
||||
}
|
||||
|
||||
var stream = new MemoryStream();
|
||||
assembly.Write(stream);
|
||||
FixLoadedAssemblyResolution();
|
||||
return AppDomain.CurrentDomain.Load(stream.ToArray());
|
||||
}
|
||||
|
||||
private static bool FixedLoadedAssemblyResolution = false;
|
||||
|
||||
// XXX: Why, without this, the already loaded assemblies are not resolved?
|
||||
public static void FixLoadedAssemblyResolution()
|
||||
{
|
||||
if (FixedLoadedAssemblyResolution)
|
||||
{
|
||||
return;
|
||||
}
|
||||
FixedLoadedAssemblyResolution = true;
|
||||
|
||||
var loadedAssemblies = new Dictionary<string, Assembly>();
|
||||
foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
|
||||
{
|
||||
loadedAssemblies[assembly.FullName] = assembly;
|
||||
}
|
||||
|
||||
AppDomain.CurrentDomain.AssemblyResolve += (sender, args) =>
|
||||
{
|
||||
if (loadedAssemblies.TryGetValue(args.Name, out var assembly))
|
||||
{
|
||||
return assembly;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user