如何从资源对象获取资源名称?

假设我在我的资源文件夹中添加了一个exe。 现在我怎么能得到资源的名称(甚至链接的完整路径,以便我仍然可以拥有文件名)作为字符串?

Properties.Resources.myApp我如何获得string "myApp" 。 ToString()不起作用。 如果嵌入文件以获取名称很重要,我可以。

编辑:我的问题不是专门获取exe资源的名称。 但是那个通用的方法给了我资源的名称! 例如,如果我的资源是位图图像怎么办? 我需要从Properties.Resources.Lily打印“Lily”。 怎么做到这一点? ToString无论如何都不会工作。

我知道这已经很老了,但接受的答案不一定是最好的答案。 从C#6.0开始,你可以使用nameof(...)

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

更简单!

使用Linq表达式非常简单:

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

Lily应该是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枚举并删除前导命名空间+尾随文件扩展名?

  // returns just the names public static IEnumerable GetEmbeddedResourceNames() { var returnList = new List(); 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");

当您在项目资源中嵌入一些文件时,它将在构建项目时嵌入到您的可执行文件中,因此它不与您的项目可执行文件分开存在,它在您的硬盘驱动器上不存在。 所以,如果你想在你的项目文件夹中将myApp.exe放在项目文件夹中,那就去吧

  • 视觉工作室>>
  • 解决方案资源管理器>>
  • 单击左上角的显示所有文件>>
  • MyApp.exe将显示>>
  • 右键单击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)); } } 

这是硬编码!!!!