From 381c10a1590056efc6db4b993bf3bc1f7811706f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jean-Philippe=20Bruy=C3=A8re?= Date: Sun, 21 Nov 2021 12:56:04 +0100 Subject: [PATCH] keep prefix in any case --- vke/src/Utils.cs | 38 ++++++++++++++++++++++++-------------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/vke/src/Utils.cs b/vke/src/Utils.cs index 405c73b..061ab85 100644 --- a/vke/src/Utils.cs +++ b/vke/src/Utils.cs @@ -37,19 +37,40 @@ namespace Vulkan { } /// /// Return a file or embedded resource stream. - /// Use ':' to split assembly and resource (ex; "Assembly:shader.vert.spv") /// + /// + /// Embedded resource path start with `#`. The entry assembly is always searched first to be able + /// to override resource defined in satellite assemblies. + /// To enforce assembly name selection, use `:` to split assembly and resource (ex; "Assembly:filename.spv"), + /// else assembly names will be determined with the first, or the two firsts names in the path string. + /// (ex: AssemblyName.filename.ext then Assembly.Name.filename.ext) + /// /// The stream from path. /// The file or stream path. Embedded resource path starts with '#' or contains ':'. public static Stream GetStreamFromPath (string path) { if (path.StartsWith("#", StringComparison.Ordinal)) { Stream stream = null; + string[] assemblyNames = null; + Assembly assembly = null; + string resId = path.Substring(1); + if (tryFindResource(Assembly.GetEntryAssembly(), resId, out stream)) return stream; - string[] assemblyNames = resId.Split('.'); - Assembly assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(aa => aa.GetName().Name == assemblyNames[0]); + + if (path.Contains(":", StringComparison.Ordinal)) { + assemblyNames = resId.Split (':'); + assembly = AppDomain.CurrentDomain.GetAssemblies ().FirstOrDefault (aa => aa.GetName ().Name == assemblyNames[0]); + if (assembly == null) + throw new Exception("Assembly not found: " + path); + if (tryFindResource(assembly, path.Replace(':', '.'), out stream)) + return stream; + throw new Exception("Embedded resource not found in assembly: " + path); + } + + assemblyNames = resId.Split('.'); + assembly = AppDomain.CurrentDomain.GetAssemblies().FirstOrDefault(aa => aa.GetName().Name == assemblyNames[0]); if (assembly == null && assemblyNames.Length > 3) assembly = AppDomain.CurrentDomain.GetAssemblies() .FirstOrDefault(aa => aa.GetName().Name == $"{assemblyNames[0]}.{assemblyNames[1]}"); @@ -57,17 +78,6 @@ namespace Vulkan { return stream; throw new Exception("Resource not found: " + path); } - if (path.Contains(":", StringComparison.Ordinal)) { - Stream stream = null; - string[] assemblyNames = path.Split (':'); - Assembly assembly = AppDomain.CurrentDomain.GetAssemblies ().FirstOrDefault (aa => aa.GetName ().Name == assemblyNames[0]); - if (assembly == null) - throw new Exception("Assembly not found: " + path); - - if (tryFindResource(assembly, path.Replace(':', '.'), out stream)) - return stream; - throw new Exception("Embedded resource not found in assembly: " + path); - } if (!File.Exists (path)) throw new FileNotFoundException ("File not found: ", path); return new FileStream (path, FileMode.Open, FileAccess.Read); -- 2.47.3