запутался в ресурсах и GetManifestResourceNames () - PullRequest
14 голосов
/ 19 ноября 2011

Я изучал ресурсы в C # и визуальной C # IDE. Теперь я смущен. Я прочитал некоторые страницы о StackOverflow, например, этот ресурс «Как получить путь пути вложения» и документацию Microsoft, но меня это смутило.

Мой первый вопрос: что такое ресурсы: это файл .resources или файлы внутри него, например значки.

секунда: когда я использую метод GetManifestResourceNames: я получаю имена файлов .resources или имена файлов внутри него. Когда я использую его в своей программе, я получаю только файлы .resources, но при чтении таких тем, как этот файл, содержащий все циклы ресурсов в файле resx, у меня складывается впечатление, что я должен получить имена файлы внутри файла .resources.

Это я или эта терминология немного сбивает с толку? Кто-нибудь может сделать это немного яснее? Спасибо за помощь.

Ответы [ 3 ]

13 голосов
/ 19 ноября 2011

Ресурсы - это любой файл, который вы компилируете, помечая его как «EmbeddedResource», это просто объединяет файл в сборку.GetManifestResourceNames() - это просто перечислитель, который дает нам имя всех встроенных файлов скомпилированных ресурсов, например, MyAssembly.resources.Фактические элементы ресурсов должны быть перечислены через ResourceSet, который загружает этот файл ресурсов.

9 голосов
/ 27 августа 2012

Я не знаю, нужен ли вам еще ответ на этот вопрос, но из моего опыта GetManifestResourceNames() возвращает имена файлов .resource, встроенных в вашу сборку.

Если вы хотите получить доступ к отдельным ресурсам, вы можете сделать что-то вроде:

Assembly assembly = Assembly.LoadFrom(assemblyName);
string[] names = assembly.GetManifestResourceNames();
ResourceSet set = new ResourceSet(assembly.GetManifestResourceStream(names[0]));
foreach (DictionaryEntry resource in set)
{
    Console.WriteLine("\n[{0}] \t{1}", resource.Key, resource.Value); 
}
6 голосов
/ 22 марта 2013

Я получил свой проект на работу из-за ответа Феличе Поллано. Я добавил в свое решение папку «Изображения» и открыл ее в проводнике Windows, а затем скопировал файл изображения в папку «Изображения». Затем перейдите в Visual Studio и нажмите «показать все файлы» в верхней части обозревателя решений, щелкните правой кнопкой мыши файл изображения в папке «Изображения» и выберите «Включить в проект». Затем я щелкнул левой кнопкой мыши по файлу изображения в обозревателе решений и в окне «Свойства» установил для действия сборки значение «Встроенный ресурс», как вы упомянули.

Вот код, где я получил доступ к этой картинке

private Dictionary<int, Image> GetImages()
{
  List<Stream> picsStrm = new List<Stream>();

  Assembly asmb = Assembly.GetExecutingAssembly();
  string[] picNames = asmb.GetManifestResourceNames();

  foreach (string s in picNames)
  {
    if (s.EndsWith(".png"))
    {
      Stream strm = asmb.GetManifestResourceStream(s);
      if (strm != null)
      {
        picsStrm.Add(strm);
      }
    }
  }

  Dictionary<int, Image> images = new Dictionary<int, Image>();

  int i = 0;

  foreach (Stream strm in picsStrm)
  {
    PngBitmapDecoder decoder = new PngBitmapDecoder(strm,
      BitmapCreateOptions.PreservePixelFormat,
      BitmapCacheOption.Default);
    BitmapSource bitmap = decoder.Frames[0] as BitmapSource;
    Image img = new Image();
    img.Source = bitmap;
    img.Stretch = Stretch.UniformToFill;
    images.Add(i, img);
    i++;

    strm.Close();
  }
  return images;
}

На самом деле из этой статьи (Приложение чата WCF-WPF) от Islam ElDemery

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...