118

我将 PNG 作为嵌入资源存储在程序集中。在同一个程序集中,我有一些这样的代码:

Bitmap image = new Bitmap(typeof(MyClass), "Resources.file.png");

名为“file.png”的文件存储在“Resources”文件夹中(在 Visual Studio 中),并被标记为嵌入式资源。

代码失败并出现异常:

在 MyNamespace.MyClass 类中找不到资源 MyNamespace.Resources.file.png

我有相同的代码(在不同的程序集中,加载不同的资源)可以工作。所以我知道这项技术是合理的。我的问题是我最终花了很多时间试图找出正确的路径是什么。如果我可以简单地查询(例如在调试器中)程序集以找到正确的路径,那将为我省去很多麻烦。

4

5 回答 5

210

这将为您提供所有资源的字符串数组:

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();
于 2008-08-26T11:21:34.333 回答
48

我发现自己每次都忘记了如何执行此操作,所以我只是将我需要的两个单行代码包装在一个小课堂中:

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();
    }
}
于 2008-08-26T14:51:12.533 回答
19

我猜你的类在不同的命名空间中。解决这个问题的规范方法是使用资源类和强类型资源:

ProjectNamespace.Properties.Resources.file

使用 IDE 的资源管理器添加资源。

于 2008-08-26T11:17:38.617 回答
8

我使用以下方法来抓取嵌入式资源:

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");
于 2015-01-16T21:59:59.897 回答
4

资源的名称是名称空间加上文件路径的“伪”名称空间。“伪”名称空间由子文件夹结构使用 \(反斜杠)而不是 . (点)。

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")

将返回位于名称空间中文件夹结构资源\xml 中的 my.xml 流:my.namespace。

于 2014-02-26T15:10:47.760 回答