From 57f8e56c38a01ea22b8524fe7afe077b76d2391f Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Tue, 27 Jul 2021 16:40:42 +0200 Subject: [PATCH] Improved RawContentManager's reader loading and added better exception handling --- CHANGELOG.md | 3 ++ MLEM.Data/Content/RawContentManager.cs | 39 ++++++++++++++++++++------ 2 files changed, 34 insertions(+), 8 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 39d0a4a..a3883e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -41,6 +41,9 @@ Improvements Additions - Added the ability to specify a coordinate offset in data texture atlases +Improvements +- Improved RawContentManager's reader loading and added better exception handling + ## 5.0.0 ### MLEM Additions diff --git a/MLEM.Data/Content/RawContentManager.cs b/MLEM.Data/Content/RawContentManager.cs index 230b2ea..40c57d6 100644 --- a/MLEM.Data/Content/RawContentManager.cs +++ b/MLEM.Data/Content/RawContentManager.cs @@ -1,7 +1,6 @@ using System; using System.Collections.Generic; using System.IO; -using System.Linq; using Microsoft.Xna.Framework; using Microsoft.Xna.Framework.Content; using Microsoft.Xna.Framework.Graphics; @@ -12,12 +11,7 @@ namespace MLEM.Data.Content { /// public class RawContentManager : ContentManager, IGameComponent { - private static readonly RawContentReader[] Readers = AppDomain.CurrentDomain.GetAssemblies() - .Where(a => !a.IsDynamic) - .SelectMany(a => a.GetExportedTypes()) - .Where(t => t.IsSubclassOf(typeof(RawContentReader)) && !t.IsAbstract) - .Select(t => t.GetConstructor(Type.EmptyTypes).Invoke(null)) - .Cast().ToArray(); + private static List readers; private readonly List disposableAssets = new List(); @@ -57,7 +51,11 @@ namespace MLEM.Data.Content { private T Read(string assetName, T existing) { var triedFiles = new List(); - foreach (var reader in Readers.Where(r => r.CanRead(typeof(T)))) { + if (readers == null) + readers = CollectContentReaders(); + foreach (var reader in readers) { + if (!reader.CanRead(typeof(T))) + continue; foreach (var ext in reader.GetFileExtensions()) { var file = Path.Combine(this.RootDirectory, $"{assetName}.{ext}"); triedFiles.Add(file); @@ -89,5 +87,30 @@ namespace MLEM.Data.Content { public void Initialize() { } + private static List CollectContentReaders() { + var ret = new List(); + foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies()) { + try { + if (assembly.IsDynamic) + continue; + foreach (var type in assembly.GetExportedTypes()) { + try { + if (type.IsAbstract) + continue; + if (!type.IsSubclassOf(typeof(RawContentReader))) + continue; + var inst = type.GetConstructor(Type.EmptyTypes).Invoke(null); + ret.Add((RawContentReader) inst); + } catch (Exception e) { + throw new NotSupportedException($"The type {type} cannot be constructed by a RawContentManager. Does it have a visible parameterless constructor?", e); + } + } + } catch { + // ignored + } + } + return ret; + } + } } \ No newline at end of file