Как получить имя ресурса из объекта resource?

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

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

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

5 ответов


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

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

гораздо проще!


довольно легко использовать выражения 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 shoud be Lily


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

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

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

        //...
    }
}

С 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" поэтому просто удалите первую часть этой строки, и у вас есть встроенное имя файла ressource.

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

 // 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;
        }

Edit:

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


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

  • visual studio >>
  • обозреватель >>
  • Нажмите кнопку Показать все файлы в верхнем левом углу >>
  • MyApp.exe будет benn видимый >>
  • щелкните правой кнопкой мыши 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));
        }
    }

это жестко !!!!