我将PNG存储为程序集中的嵌入式资源。 在同一个程序集中,我有一些像这样的代码:
1
| Bitmap image = new Bitmap(typeof(MyClass),"Resources.file.webp"); |
名为"file.webp"的文件存储在"Resources"文件夹中(在Visual Studio中),并标记为嵌入式资源。
代码失败,异常说:
Resource MyNamespace.Resources.file.webp cannot be found in class MyNamespace.MyClass
我有相同的代码(在不同的程序集中,加载不同的资源)工作。 所以我知道这种技术很合理。 我的问题是我最终花了很多时间试图弄清楚正确的路径是什么。 如果我可以简单地查询(例如在调试器中)程序集以找到正确的路径,那将为我节省大量的麻烦。
这将获得所有资源的字符串数组:
1
| System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames(); |
我发现自己每次都忘记了如何做到这一点,所以我只需要在一个小课程中包装我需要的两个单行:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| 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.webp 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.webp. 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();
}
} |
我猜你的类在不同的命名空间中。解决此问题的规范方法是使用资源类和强类型资源:
1
| ProjectNamespace.Properties.Resources.file |
使用IDE的资源管理器添加资源。
我使用以下方法来获取嵌入资源:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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);
} |
然后我用项目中的路径调用它:
1
| GetResourceStream(@"DirectoryPathInLibrary/Filename") |
资源的名称是名称空间加上文件路径的"伪"名称空间。"伪"名称空间由子文件夹结构使用(反斜杠)而不是。 (点)。
1 2 3 4 5 6
| public static Stream GetResourceFileStream(String nameSpace, String filePath)
{
String pseduoName = filePath.Replace('\', '.');
Assembly assembly = Assembly.GetExecutingAssembly();
return assembly.GetManifestResourceStream(nameSpace +"." + pseduoName);
} |
以下电话:
1
| GetResourceFileStream("my.namespace","resources\\xml\\my.xml") |
将返回位于名称空间:my.namespace中的文件夹结构resources xml中的my.xml流。