hybridclr_unity/Editor/Meta/MetaUtil.cs

153 lines
4.3 KiB
C#
Raw Normal View History

2022-09-22 08:56:07 +08:00
using dnlib.DotNet;
using HybridCLR.Editor.Meta;
using System;
using System.Collections.Generic;
using System.IO;
2022-09-22 08:56:07 +08:00
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEditor;
2022-09-22 08:56:07 +08:00
2022-10-17 12:16:18 +08:00
namespace HybridCLR.Editor.Meta
2022-09-22 08:56:07 +08:00
{
public static class MetaUtil
{
2022-10-17 12:16:18 +08:00
public static bool EqualsTypeSig(TypeSig a, TypeSig b)
{
if (a == b)
{
return true;
}
if (a != null && b != null)
{
return TypeEqualityComparer.Instance.Equals(a, b);
}
return false;
}
public static bool EqualsTypeSigArray(List<TypeSig> a, List<TypeSig> b)
{
if (a == b)
{
return true;
}
if (a != null && b != null)
{
if (a.Count != b.Count)
{
return false;
}
for (int i = 0; i < a.Count; i++)
{
if (!TypeEqualityComparer.Instance.Equals(a[i], b[i]))
{
return false;
}
}
return true;
}
return false;
}
2022-09-22 08:56:07 +08:00
public static TypeSig Inflate(TypeSig sig, GenericArgumentContext ctx)
{
if (!sig.ContainsGenericParameter)
{
return sig;
}
return ctx.Resolve(sig);
}
public static TypeSig ToShareTypeSig(TypeSig typeSig)
{
var corTypes = typeSig?.Module?.CorLibTypes;
if (corTypes == null)
{
return typeSig;
}
var a = typeSig.RemovePinnedAndModifiers();
switch (a.ElementType)
2022-09-22 08:56:07 +08:00
{
case ElementType.Void: return corTypes.Void;
case ElementType.Boolean: return corTypes.Byte;
case ElementType.Char: return corTypes.UInt16;
case ElementType.I1: return corTypes.SByte;
2022-09-22 08:56:07 +08:00
case ElementType.U1:return corTypes.Byte;
case ElementType.I2: return corTypes.Int16;
2022-09-22 08:56:07 +08:00
case ElementType.U2: return corTypes.UInt16;
case ElementType.I4: return corTypes.Int32;
2022-09-22 08:56:07 +08:00
case ElementType.U4: return corTypes.UInt32;
case ElementType.I8: return corTypes.Int64;
2022-09-22 08:56:07 +08:00
case ElementType.U8: return corTypes.UInt64;
case ElementType.R4: return corTypes.Single;
case ElementType.R8: return corTypes.Double;
case ElementType.String: return corTypes.Object;
case ElementType.TypedByRef: return corTypes.TypedReference;
case ElementType.I: return corTypes.IntPtr;
2022-09-22 08:56:07 +08:00
case ElementType.U: return corTypes.UIntPtr;
case ElementType.Object: return corTypes.Object;
case ElementType.Sentinel: return typeSig;
case ElementType.Ptr: return corTypes.IntPtr;
case ElementType.ByRef: return corTypes.IntPtr;
2022-09-22 08:56:07 +08:00
case ElementType.SZArray: return corTypes.Object;
case ElementType.Array: return corTypes.Object;
case ElementType.ValueType: return typeSig;
case ElementType.Class: return corTypes.Object;
case ElementType.GenericInst:
{
var gia = (GenericInstSig)a;
if (gia.GenericType.IsClassSig)
{
return corTypes.Object;
}
return new GenericInstSig(gia.GenericType, gia.GenericArguments.Select(ga => ToShareTypeSig(ga)).ToList());
}
case ElementType.FnPtr: return corTypes.IntPtr;
2022-09-22 08:56:07 +08:00
case ElementType.ValueArray: return typeSig;
case ElementType.Module: return typeSig;
default:
throw new NotSupportedException(typeSig.ToString());
}
}
public static List<TypeSig> ToShareTypeSigs(IList<TypeSig> typeSigs)
{
if (typeSigs == null)
{
return null;
}
return typeSigs.Select(s => ToShareTypeSig(s)).ToList();
}
public static IAssemblyResolver CreateHotUpdateAssemblyResolver(BuildTarget target)
2022-09-22 08:56:07 +08:00
{
var externalDirs = HybridCLRSettings.Instance.externalHotUpdateAssembliyDirs;
var defaultHotUpdateOutputDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);
if (externalDirs == null || externalDirs.Length == 0)
{
return new PathAssemblyResolver(defaultHotUpdateOutputDir);
}
else
{
var externalDirList = new List<string>();
foreach (var dir in externalDirs)
{
externalDirList.Add($"{dir}/{target}");
externalDirList.Add(dir);
}
externalDirList.Add(defaultHotUpdateOutputDir);
return new PathAssemblyResolver(externalDirList.ToArray());
}
}
public static IAssemblyResolver CreateBuildTargetAssemblyResolver(BuildTarget target)
{
return new CombinedAssemblyResolver(CreateHotUpdateAssemblyResolver(target),
new UnityPluginAssemblyResolver(),
new UnityDotNetAOTAssemblyResolver(),
new UnityEditorAssemblyResolver());
2022-09-22 08:56:07 +08:00
}
}
}