Как получить имя ресурса из объекта ресурса? - PullRequest
9 голосов
/ 04 марта 2012

Скажем, у меня есть exe-файл, добавленный в мою папку ресурсов.Теперь, как я могу получить имя (или даже полный путь, с которым он связан, чтобы у меня все еще было имя файла) ресурса в виде строки?

С Properties.Resources.myApp как мне получить string "myApp".ToString () не работает.Если важно внедрить файл, чтобы получить имя, я могу.

Редактировать: Мой вопрос не специально, чтобы получить имя ресурса exe.Но это один общий подход, который дает мне имя ресурса!Например, что если мой ресурс является растровым изображением?Мне нужно напечатать "Лили" из Properties.Resources.Lily.Как этого добиться?ToString не будет работать в любом случае.

Ответы [ 5 ]

21 голосов
/ 09 марта 2012

С помощью выражений Linq довольно просто:

using System.Linq.Expressions;
//...
static string GetNameOf<T>(Expression<Func<T>> property)
{
  return (property.Body as MemberExpression).Member.Name;
}
// Usage:
var s = GetNameOf(() => Properties.Resources.Lily);

s должно быть Lily

6 голосов
/ 11 декабря 2017

Я знаю, что это очень старо, но принятый ответ не обязательно является лучшим ответом. Начиная с C # 6.0 вы можете просто использовать nameof(...):

string resourceName = nameof(Properties.Resources.MyResourceName);
// resourceName == "MyResourceName"

Намного проще!

1 голос
/ 07 марта 2012

Вы хотите иметь в виду сборку?Вот небольшой фрагмент кода, который получает все exe-файлы из каталога:

foreach (string fileName in Directory.GetFiles("./Files"))
{
    FileInfo fileInfo = new FileInfo(fileName);

    if (fileInfo.Extension.Equals(".exe"))
    {
        Assembly pluginAssembly = Assembly.LoadFrom(fileName);

        //...
    }
}
1 голос
/ 07 марта 2012

С System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); вы получаете список всех ресурсов в вашем проекте.

Теперь, если вы хотите найти все exe-файлы (полагаю, у вас есть только один встроенный файл), используйте следующий фрагмент, чтобы получить имя вашей сборки.

   var ressourceList = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
   var filename = ressourceList.Where(x => x.EndsWith(".exe")).FirstOrDefault();

Формат строки "YourProgram.YourAssemblyName.exe", поэтому просто удалите первую часть этой строки, и у вас будет встроенное имя файла ресурса.

Редактировать: Почему бы вам не перечислить свои ресурсы и не удалить лидирующее пространство имен + конечные расширения файлов?

 // returns just the names
  public static IEnumerable<String> GetEmbeddedResourceNames()
        {
            var returnList = new List<String>();
            foreach (var res in Assembly.GetExecutingAssembly().GetManifestResourceNames())
            {
                var s = Assembly.GetExecutingAssembly().GetName();
                returnList.Add(Regex.Replace(res.Replace(s.Name + ".", ""), @"\.[^.]*$", ""));
            }
            return returnList;
        }

Редактировать:

Чтобы получить ресурс по имени, используйте var prop = Properties.Resources.ResourceManager.GetObject("YourRessourceNameWithoutExtension");

0 голосов
/ 04 марта 2012

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

  • visual studio >>
  • Обозреватель решений >>
  • НажмитеПоказать все файлы в верхнем левом углу >>
  • MyApp.exe не будет виден >>
  • Щелкните правой кнопкой мыши myApp.exe, щелкните Включить в проект >>
  • Нажмите F4, чтобыстраница свойств показана и сфокусирована >>
  • установите для параметра Копировать в выходной каталог значение «Копировать всегда»

enter image description hereenter image description here

Сейчас , если вы хотите, чтобы путь к myApp.exe использовался:

System.IO.Path.Combine(Application.StartupPath, "myApp.exe");

Обновление Вы должны жестко кодировать "myApp", потому что если вы переходите к определению:

Properties.Resources.myApp 

вы увидите:

internal static byte[] myApp {
        get {
            object obj = ResourceManager.GetObject("myApp", resourceCulture);
            return ((byte[])(obj));
        }
    }

Это жестко закодировано !!!!

...