Сведения о вопросе

Pytdev

21:06, 1st October, 2020

Теги

c#   .net   resources    

Как я могу обнаружить "path" встроенного ресурса?

Просмотров: 492   Ответов: 5

Я храню PNG как встроенный ресурс в assembly. Из того же assembly у меня есть такой код:

Bitmap image = new Bitmap(typeof(MyClass), "Resources.file.png");

Файл с именем " file.png " хранится в папке "Resources" (в Visual Studio) и помечается как встроенный ресурс.

Код завершается ошибкой с исключением, говорящим::

Ресурс MyNamespace.Resources.file.png не может быть найден в классе MyNamespace.MyClass

У меня есть идентичный код(в другом assembly, загрузка другого ресурса), который работает. Так что я знаю, что техника-это звук. Моя проблема заключается в том, что я в конечном итоге трачу много времени, пытаясь выяснить, какой правильный путь является. Если бы я мог просто спросить (например. в отладчике) assembly найти правильный путь, что избавило бы меня от груза головной боли.



  Сведения об ответе

dump

11:09, 22nd August, 2020

Это даст вам строковый массив всех ресурсов:

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();


  Сведения об ответе

SILA

01:39, 1st August, 2020

Я ловлю себя на том, что каждый раз забываю, как это сделать, поэтому я просто заворачиваю два однострочника, которые мне нужны в небольшом классе:

public class Utility
{
    /// <summary>
    /// Takes the full name of a resource and loads it in to a stream.
    /// </summary>
    /// <param name="resourceName">Assuming an embedded resource is a file
    /// called info.png and is located in a folder called Resources, it
    /// will be compiled in to the assembly with this fully qualified
    /// name: Full.Assembly.Name.Resources.info.png. That is the string
    /// that you should pass to this method.</param>
    /// <returns></returns>
    public static Stream GetEmbeddedResourceStream(string resourceName)
    {
        return Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
    }

    /// <summary>
    /// Get the list of all emdedded resources in the assembly.
    /// </summary>
    /// <returns>An array of fully qualified resource names</returns>
    public static string[] GetEmbeddedResourceNames()
    {
        return Assembly.GetExecutingAssembly().GetManifestResourceNames();
    }
}


  Сведения об ответе

VERSUION

23:33, 18th August, 2020

Я предполагаю, что ваш класс находится в другом пространстве имен. Каноническим способом решения этой проблемы было бы использование класса resources и строго типизированного ресурса:

ProjectNamespace.Properties.Resources.file

Используйте диспетчер ресурсов IDE для добавления ресурсов.


  Сведения об ответе

Chhiki

22:30, 27th August, 2020

Я использую следующий метод для захвата внедренных ресурсов:

    protected static Stream GetResourceStream(string resourcePath)
    {
        Assembly assembly = Assembly.GetExecutingAssembly();
        List<string> resourceNames = new List<string>(assembly.GetManifestResourceNames());

        resourcePath = resourcePath.Replace(@"/", ".");
        resourcePath = resourceNames.FirstOrDefault(r => r.Contains(resourcePath));

        if (resourcePath == null)
            throw new FileNotFoundException("Resource not found");

        return assembly.GetManifestResourceStream(resourcePath);
    }

Затем я вызываю это с помощью пути в проекте:

GetResourceStream(@"DirectoryPathInLibrary/Filename")


  Сведения об ответе

+-*/

19:22, 7th August, 2020

Имя ресурса - это пространство имен плюс пространство имен "pseudo" пути к файлу. Пространство имен "pseudo" создается структурой вложенных папок с использованием \ (обратные косые черты) вместо . (ДОТС).

public static Stream GetResourceFileStream(String nameSpace, String filePath)
{
    String pseduoName = filePath.Replace('\\', '.');
    Assembly assembly = Assembly.GetExecutingAssembly();
    return assembly.GetManifestResourceStream(nameSpace + "." + pseduoName);
}

Следующий вызов:

GetResourceFileStream("my.namespace", "resources\\xml\\my.xml")

вернет поток my.xml, расположенный в папке-структуре resources\xml в пространстве имен: my.namespace.


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться