Files
se-launcher/CringePlugins/Utils/IntrospectionContext.cs
pas2704 ad204c6ecb
All checks were successful
Build / Compute Version (push) Successful in 5s
Build / Build Nuget package (CringeBootstrap.Abstractions) (push) Successful in 2m2s
Build / Build Nuget package (NuGet) (push) Successful in 2m50s
Build / Build Nuget package (CringePlugins) (push) Successful in 3m19s
Build / Build Nuget package (SharedCringe) (push) Successful in 2m31s
Build / Build Launcher (push) Successful in 3m24s
Fix mod components loading
2024-11-02 15:19:05 -04:00

49 lines
1.7 KiB
C#

using System.Reflection;
using dnlib.DotNet;
namespace CringePlugins.Utils;
public class IntrospectionContext
{
public static IntrospectionContext Global { get; } = new();
internal readonly ModuleContext Context = ModuleDef.CreateModuleContext();
public IEnumerable<Type> CollectAttributedTypes<TAttribute>(Module module, bool allowAbstract = false) where TAttribute : Attribute
{
var moduleDef = ModuleDefMD.Load(module, Context);
return moduleDef.GetTypes()
.Where(b => b.CustomAttributes.IsDefined(typeof(TAttribute).FullName) && (allowAbstract || !b.IsAbstract))
.Select(b => module.GetType(b.FullName.Replace('/', '+'), true, false)!);
}
public IEnumerable<Type> CollectDerivedTypes<T>(Module module, bool allowAbstract = false)
{
var moduleDef = ModuleDefMD.Load(module, Context);
var token = moduleDef.ImportAsTypeSig(typeof(T));
return moduleDef.GetTypes()
.Where(b => (typeof(T).IsInterface
? b.Interfaces.Any(i => i.Interface.FullName == token.FullName)
: MatchBaseType(b, token)) && (allowAbstract || !b.IsAbstract))
.Select(b => module.GetType(b.FullName.Replace('/', '+'), true, false)!);
}
private static bool MatchBaseType(ITypeDefOrRef? defOrRef, TypeSig token)
{
while ((defOrRef = defOrRef.GetBaseType()) != null)
{
if (defOrRef.FullName == token.FullName)
return true;
}
return false;
}
}
public static class AssemblyExtensions
{
public static Module GetMainModule(this Assembly assembly) => assembly.GetModule(assembly.GetName().Name! + ".dll") ?? assembly.GetModules()[0];
}