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

时间:2012-03-04 14:30:29

标签: c# winforms resources .net-2.0

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

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

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

5 个答案:

答案 0 :(得分: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 :(得分:6)

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

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

更简单!

答案 2 :(得分:1)

你的意思是你想要组装吗?这里有一个小代码片段,可以从目录中获取所有exe文件:

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

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

        //...
    }
}

答案 3 :(得分:1)

使用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");

答案 4 :(得分:0)

当您在项目资源中嵌入一些文件时,它将在构建项目时嵌入到您的可执行文件中,因此它不会与您的项目可执行文件分开存在,它在您的硬盘驱动器上不存在。 因此,如果您希望项目文件夹中的myApp.exe将其放在项目文件夹中,请转到

  • visual studio&gt;&gt;
  • 解决方案资源管理器&gt;&gt;
  • 点击左上角的所有文件&gt;&gt;
  • MyApp.exe将显示&gt;&gt;
  • 右键单击myApp.exe,单击“包含在项目中”&gt;&gt;
  • 点击F4,显示属性页面并重点关注&gt;&gt;
  • 将复制到输出目录设置为“始终复制”

enter image description here enter 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));
        }
    }

这是硬编码!!!!