Как получить имя ресурса из объекта 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, чтобы страница свойств отображалась и фокусировалась >>
- установить копировать в выходной каталог на "копировать всегда"
теперь если вы хотите путь 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));
}
}
это жестко !!!!