Get embedded resource using case-insensitive .Net file name

I am currently using GetManifestResourceStream to access embedded resources. The resource name comes from an external source that is not case sensitive. Is there a way to access case-insensitive embedded resources?

I would prefer not to name all my embedded resources in lowercase only.

+4
source share
3 answers

Assuming you know resource names from an external source and lack capitalization, this function creates a dictionary that you can use to search to align two sets of names.

you know -> externally provided MyBitmap -> MYBITMAP myText -> MYTEXT /// <summary> /// Get a mapping of known resource names to embedded resource names regardless of capitlalization /// </summary> /// <param name="knownResourceNames">Array of known resource names</param> /// <returns>Dictionary mapping known resource names [key] to embedded resource names [value]</returns> private Dictionary<string, string> GetEmbeddedResourceMapping(string[] knownResourceNames) { System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly(); string[] resources = assembly.GetManifestResourceNames(); Dictionary<string, string> resourceMap = new Dictionary<string, string>(); foreach (string resource in resources) { foreach (string knownResourceName in knownResourceNames) { if (resource.ToLower().Equals(knownResourceName.ToLower())) { resourceMap.Add(knownResourceName, resource); break; // out of the inner foreach } } } return resourceMap; } 
+11
source

If you do not want to create a dictionary in advance, this will work.

  private static Stream GetResourceStream(string name) { var assembly = Assembly.GetExecutingAssembly(); //Replace path seperators with '.' seperators var path = string .Concat( assembly.GetName().Name, ".", name) .Replace('/','.') .Replace('\\','.'); // Match using case invariant matching path = assembly .GetManifestResourceNames() .FirstOrDefault(p => p.ToLowerInvariant() == path.ToLowerInvariant()); if(path==null) throw new ArgumentNullException($"Can't find resource {name}",nameof(name)); var manifestResourceStream = assembly.GetManifestResourceStream(path); if (manifestResourceStream == null) throw new ArgumentNullException($"Can't find resource {name}",nameof(name)); return manifestResourceStream; } 
+2
source

A similar answer to the one accepted above, but I wanted to share my solution in VB.NET.

 ''' <summary> ''' Gets the file name in its proper case as found in the assembly. ''' </summary> ''' <param name="fileName">The filename to check</param> ''' <param name="assemblyNamespace">The namespace name, such as Prism.Common</param> ''' <param name="assembly">The assembly to search</param> ''' <returns>The file name as found in the assembly in its proper case, otherwise just filename as it is passed in.</returns> ''' <remarks></remarks> Public Shared Function GetProperFileNameCaseInAssembly(ByVal fileName As String, ByVal assemblyNamespace As String, ByVal assembly As System.Reflection.Assembly) As String For Each resource As String In assembly.GetManifestResourceNames() 'Perform a case insensitive search to get the correct casing for the filename If (resource.ToLower().Equals(String.Format("{0}.{1}", assemblyNamespace, fileName).ToLower())) Then 'cut off the namespace assembly name in the resource (length + 1 to include the ".") to return the file name Return resource.Substring(assemblyNamespace.Length + 1) End If Next Return fileName 'couldn't find the equivalent, so just return the same file name passed in End Function 
0
source

Source: https://habr.com/ru/post/1286041/


All Articles