假设我在我的资源文件夹中添加了一个exe。现在我怎么能得到资源的名称(甚至链接的完整路径,以便我仍然可以拥有文件名)作为字符串?
从Properties.Resources.myApp
我如何获得string "myApp"
。 ToString()不起作用。如果嵌入文件以获取名称很重要,我可以。
编辑:我的问题不是专门获取exe资源的名称。但是那个通用的方法给了我资源的名称!例如,如果我的资源是位图图像怎么办?我需要从Properties.Resources.Lily
打印“Lily”。怎么做到这一点? ToString无论如何都不会工作。
答案 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将其放在项目文件夹中,请转到
现在如果您想使用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));
}
}
这是硬编码!!!!