[英]How can I discover the “path” of an embedded resource?
我将PNG存储为程序集中的嵌入式资源。 在同一个程序集中,我有一些这样的代码:
Bitmap image = new Bitmap(typeof(MyClass), "Resources.file.png");
名为“ file.png”的文件存储在“资源”文件夹中(在Visual Studio中),并被标记为嵌入式资源。
该代码失败,并显示以下异常:
在类MyNamespace.MyClass中找不到资源MyNamespace.Resources.file.png
我有相同的代码(在不同的程序集中,加载了不同的资源)可以工作。 所以我知道这项技术是合理的。 我的问题是我最终花费大量时间试图找出正确的路径。 如果我可以简单地查询(例如在调试器中)程序集以找到正确的路径,那将为我省去很多麻烦。
这将为您提供所有资源的字符串数组:
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
我发现自己也忘记了每次都该怎么做,因此我只把我需要的两个单线包装起来:
public class Utility
{
/// <summary>
/// Takes the full name of a resource and loads it in to a stream.
/// </summary>
/// <param name="resourceName">Assuming an embedded resource is a file
/// called info.png and is located in a folder called Resources, it
/// will be compiled in to the assembly with this fully qualified
/// name: Full.Assembly.Name.Resources.info.png. That is the string
/// that you should pass to this method.</param>
/// <returns></returns>
public static Stream GetEmbeddedResourceStream(string resourceName)
{
return Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName);
}
/// <summary>
/// Get the list of all emdedded resources in the assembly.
/// </summary>
/// <returns>An array of fully qualified resource names</returns>
public static string[] GetEmbeddedResourceNames()
{
return Assembly.GetExecutingAssembly().GetManifestResourceNames();
}
}
我猜您的课程位于其他名称空间中。 解决此问题的规范方法是使用资源类和强类型资源:
ProjectNamespace.Properties.Resources.file
使用IDE的资源管理器添加资源。
我使用以下方法来获取嵌入式资源:
protected static Stream GetResourceStream(string resourcePath)
{
Assembly assembly = Assembly.GetExecutingAssembly();
List<string> resourceNames = new List<string>(assembly.GetManifestResourceNames());
resourcePath = resourcePath.Replace(@"/", ".");
resourcePath = resourceNames.FirstOrDefault(r => r.Contains(resourcePath));
if (resourcePath == null)
throw new FileNotFoundException("Resource not found");
return assembly.GetManifestResourceStream(resourcePath);
}
然后,我将其与项目中的路径一起调用:
GetResourceStream(@"DirectoryPathInLibrary/Filename")
资源的名称是名称空间加上文件路径的“伪”名称空间。 子文件夹结构使用\\(反斜杠)而不是来构成“伪”命名空间。 (点)。
public static Stream GetResourceFileStream(String nameSpace, String filePath)
{
String pseduoName = filePath.Replace('\\', '.');
Assembly assembly = Assembly.GetExecutingAssembly();
return assembly.GetManifestResourceStream(nameSpace + "." + pseduoName);
}
以下调用:
GetResourceFileStream("my.namespace", "resources\\xml\\my.xml")
将返回位于名称空间my.namespace中的文件夹结构resources \\ xml中的my.xml流。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.