2012-03-04 4 views
9

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

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

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

ответ

2

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

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

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

0

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

  • Visual Studio >>
  • Solution мореплаватель >>
  • Нажмите Показать все файлы в левом верхнем углу >>
  • MyApp.exe будет Бенн видна >>
  • правой кнопкой мыши MYAPP.EXE нажмите Включить в проект >>
  • Hit F4 так страница свойств отображается и целенаправленный >>
  • набор Копировать в выходной каталог для "Копировать всегда"

enter image description hereenter image description here

Теперь если вы хотите путь MYAPP.EXE использования:

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

Update Вы должны hard code "myApp", потому что если вы идете к определению:

Properties.Resources.myApp 

вы увидите:

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

Это жёстко !!!!

+0

Это совсем не мой вопрос, нигде! См., Что я не добавляю свой exe как отдельный элемент, но добавляю его к ресурсам, чтобы в будущем я смог его вставить. Мой вопрос: как получить имя строки из элемента ресурса, все программно. Как во время выполнения я знаю, как называется «myApp»? Я не могу просто жестко кодировать «myapp.exe» – nawfal

+0

Когда вы используете ресурсы, нет FULLPATH, потому что это не на жестком диске ... в любом случае может объяснить, что именно вы хотите –

+0

Разве это не на жестком диске, когда я просто добавляю, а не внедряю? Также мне не нужно fullPath. Будет только имя файла. – nawfal

1

Вы хотите иметь сборку? Здесь немного фрагмент кода, который get's вам все EXE-файлы из каталога:

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

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

     //... 
    } 
} 
+0

Это работа вокруг. Не решение того, что я прошу. Я отредактирую свой вопрос. – nawfal

1

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

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

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

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

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

// 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:

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

+0

Это работа вокруг. Не решение того, что я прошу. Я отредактирую свой вопрос. – nawfal

+0

это снова, хотя и ближе, дает список имен ресурсов, теперь, как я знаю, какой файл соответствует чему? Что делать, если у меня встроено более одного файла exe. Мое требование - для C# 2.0. – nawfal

+0

У вас не может быть 2 ресурса с одинаковым именем (новое заменило бы старый) - теперь, как я должен знать, какой ресурс вы хотите? Если у вас есть 2 exe-файла App.exe и App1.exe, ВЫ, как программист должен каким-то образом определить, что использовать, не так ли? – Alex

21

Это довольно легко с помощью 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

+1

Конечно, это не вернет имя файла, но имя сгенерированного свойства, если вы использовали 'ResXFileCodeGenerator' (который, по-вашему, кажется). Если вы хотите фактическое имя файла, это невозможно: созданный ' Designer.cs' даже не имеет ссылки на имя файла, а' .resx' только имеет его во время компиляции, а не в ru Ntime. – Jcl

+0

очень приятно. Как C# 2.0 реализация этого будет? – nawfal

+1

Извините, я пропустил этот тег ... не в любом, возможно, простом в использовании способе, так как вы не можете передавать свойства как параметры без Linq, это должно быть сделано через магические строки, и это будет означать, что вы уже имеете строка с этим именем. Лучшим вариантом будет расширение ResXFileCodeGenerator и создание некоторого строкового свойства для каждого из ресурсов. Один из возможных способов начать - это [эта статья кодекса] (http://www.codeproject.com/Articles/13830/Extended-Strongly-Typed-Resource-Generator) (посмотрите на нижнюю часть, она уже дает вам имена ресурсов как consts). – Jcl

Смежные вопросы