如何发现嵌入式资源的“路径”?


110

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

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

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

该代码失败,并显示以下异常:

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

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

Answers:


198

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

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames();

3
嘿,如何获取资源文件夹路径以将其分配为嵌入式http服务器的根目录?
lazzy_ms

45

我发现自己也忘记了每次都该怎么做,所以我只把我需要的两条单线包装成一小堂课:

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();
    }
}

19

我猜您的课程位于其他名称空间中。解决此问题的规范方法是使用资源类和强类型资源:

ProjectNamespace.Properties.Resources.file

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


没错,我的课程位于其他名称空间中。似乎Resources文件夹位于项目配置中指定为默认名称空间的名称空间下,由于各种原因,该名称空间不是该类所属的名称空间。我怀疑您完全正确地使用另一种方法也是正确的,但是由于我需要与遗留代码保持一致,因此这超出了我的控制范围。
罗布

7
这将获取资源-而不是文件路径。
Uchiha Itachi

3
@UchihaItachi这就是为什么我明确提供此答案的原因,这是解决根本问题的另一种方式(可以说是规范的),而不是逐字回答问题(无论如何已经有答案)。
康拉德·鲁道夫

1
@UchihaItachi该问题还告诉询问者所面临的问题,他的方法是什么以及到目前为止他是如何尝试的。尽管鲁道夫没有直接回答问题,但他提出了另一种解决问题的方法。在大多数情况下,这种方法更加方便,安全和通用。这个答案很有帮助。我只是不明白为什么您必须尝试关闭人们的答案。出现“向上投票” /“向下投票”按钮是有原因的。

5

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

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

3

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

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流。


6
文件夹中的短划线('-')也会被下划线('_')代替。可能还有其他符号。我想看看编译器是如何做到的,所以我们可以使用相同的方法。
Boyko Karadzhov 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.