MetaUtil.cs 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. using dnlib.DotNet;
  2. using HybridCLR.Editor.Meta;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.IO;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using UnityEditor;
  10. namespace HybridCLR.Editor.Meta
  11. {
  12. public static class MetaUtil
  13. {
  14. public static bool EqualsTypeSig(TypeSig a, TypeSig b)
  15. {
  16. if (a == b)
  17. {
  18. return true;
  19. }
  20. if (a != null && b != null)
  21. {
  22. return TypeEqualityComparer.Instance.Equals(a, b);
  23. }
  24. return false;
  25. }
  26. public static bool EqualsTypeSigArray(List<TypeSig> a, List<TypeSig> b)
  27. {
  28. if (a == b)
  29. {
  30. return true;
  31. }
  32. if (a != null && b != null)
  33. {
  34. if (a.Count != b.Count)
  35. {
  36. return false;
  37. }
  38. for (int i = 0; i < a.Count; i++)
  39. {
  40. if (!TypeEqualityComparer.Instance.Equals(a[i], b[i]))
  41. {
  42. return false;
  43. }
  44. }
  45. return true;
  46. }
  47. return false;
  48. }
  49. public static TypeSig Inflate(TypeSig sig, GenericArgumentContext ctx)
  50. {
  51. if (!sig.ContainsGenericParameter)
  52. {
  53. return sig;
  54. }
  55. return ctx.Resolve(sig);
  56. }
  57. public static TypeSig ToShareTypeSig(TypeSig typeSig)
  58. {
  59. var corTypes = typeSig?.Module?.CorLibTypes;
  60. if (corTypes == null)
  61. {
  62. return typeSig;
  63. }
  64. var a = typeSig.RemovePinnedAndModifiers();
  65. switch (a.ElementType)
  66. {
  67. case ElementType.Void: return corTypes.Void;
  68. case ElementType.Boolean: return corTypes.Byte;
  69. case ElementType.Char: return corTypes.UInt16;
  70. case ElementType.I1: return corTypes.SByte;
  71. case ElementType.U1:return corTypes.Byte;
  72. case ElementType.I2: return corTypes.Int16;
  73. case ElementType.U2: return corTypes.UInt16;
  74. case ElementType.I4: return corTypes.Int32;
  75. case ElementType.U4: return corTypes.UInt32;
  76. case ElementType.I8: return corTypes.Int64;
  77. case ElementType.U8: return corTypes.UInt64;
  78. case ElementType.R4: return corTypes.Single;
  79. case ElementType.R8: return corTypes.Double;
  80. case ElementType.String: return corTypes.Object;
  81. case ElementType.TypedByRef: return corTypes.TypedReference;
  82. case ElementType.I: return corTypes.IntPtr;
  83. case ElementType.U: return corTypes.UIntPtr;
  84. case ElementType.Object: return corTypes.Object;
  85. case ElementType.Sentinel: return typeSig;
  86. case ElementType.Ptr: return corTypes.IntPtr;
  87. case ElementType.ByRef: return corTypes.IntPtr;
  88. case ElementType.SZArray: return corTypes.Object;
  89. case ElementType.Array: return corTypes.Object;
  90. case ElementType.ValueType: return typeSig;
  91. case ElementType.Class: return corTypes.Object;
  92. case ElementType.GenericInst:
  93. {
  94. var gia = (GenericInstSig)a;
  95. if (gia.GenericType.IsClassSig)
  96. {
  97. return corTypes.Object;
  98. }
  99. return new GenericInstSig(gia.GenericType, gia.GenericArguments.Select(ga => ToShareTypeSig(ga)).ToList());
  100. }
  101. case ElementType.FnPtr: return corTypes.IntPtr;
  102. case ElementType.ValueArray: return typeSig;
  103. case ElementType.Module: return typeSig;
  104. default:
  105. throw new NotSupportedException(typeSig.ToString());
  106. }
  107. }
  108. public static List<TypeSig> ToShareTypeSigs(IList<TypeSig> typeSigs)
  109. {
  110. if (typeSigs == null)
  111. {
  112. return null;
  113. }
  114. return typeSigs.Select(s => ToShareTypeSig(s)).ToList();
  115. }
  116. public static IAssemblyResolver CreateHotUpdateAssemblyResolver(BuildTarget target, List<string> hotUpdateDlls)
  117. {
  118. var externalDirs = HybridCLRSettings.Instance.externalHotUpdateAssembliyDirs;
  119. var defaultHotUpdateOutputDir = SettingsUtil.GetHotUpdateDllsOutputDirByTarget(target);
  120. IAssemblyResolver defaultHotUpdateResolver = new FixedSetAssemblyResolver(defaultHotUpdateOutputDir, hotUpdateDlls);
  121. if (externalDirs == null || externalDirs.Length == 0)
  122. {
  123. return defaultHotUpdateResolver;
  124. }
  125. else
  126. {
  127. var resolvers = new List<IAssemblyResolver>();
  128. foreach (var dir in externalDirs)
  129. {
  130. resolvers.Add(new FixedSetAssemblyResolver($"{dir}/{target}", hotUpdateDlls));
  131. resolvers.Add(new FixedSetAssemblyResolver(dir, hotUpdateDlls));
  132. }
  133. resolvers.Add(defaultHotUpdateResolver);
  134. return new CombinedAssemblyResolver(resolvers.ToArray());
  135. }
  136. }
  137. public static IAssemblyResolver CreateAOTAssemblyResolver(BuildTarget target)
  138. {
  139. return new PathAssemblyResolver(SettingsUtil.GetAssembliesPostIl2CppStripDir(target));
  140. }
  141. public static IAssemblyResolver CreateHotUpdateAndAOTAssemblyResolver(BuildTarget target, List<string> hotUpdateDlls)
  142. {
  143. return new CombinedAssemblyResolver(
  144. CreateHotUpdateAssemblyResolver(target, hotUpdateDlls),
  145. CreateAOTAssemblyResolver(target)
  146. );
  147. }
  148. }
  149. }