Получить встроенный ресурс, используя нечувствительное к регистру имя файла в .Net - PullRequest
4 голосов
/ 11 июня 2009

В настоящее время я использую GetManifestResourceStream для доступа к встроенным ресурсам. Название ресурса происходит от внешнего источника, который не чувствителен к регистру. Есть ли способ получить доступ к встроенным ресурсам без учета регистра?

Я бы не стал называть все мои встроенные ресурсы только строчными буквами.

Ответы [ 3 ]

11 голосов
/ 11 июня 2009

Предполагая , что вы знаете имена ресурсов из внешнего источника и вам не хватает только заглавных букв, эта функция создает словарь, который вы можете использовать для поиска, чтобы выровнять два набора имен.

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;
}
2 голосов
/ 13 декабря 2016

Если вы не хотите создавать словарь заранее, это сработает.

 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;
    }
0 голосов
/ 27 марта 2014

Ответ аналогичен принятому выше, но я хотел поделиться своим решением в 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
...