简体   繁体   English

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

[英]How can I discover the “path” of an embedded resource?

I am storing a PNG as an embedded resource in an assembly. 我将PNG存储为程序集中的嵌入式资源。 From within the same assembly I have some code like this: 在同一个程序集中,我有一些这样的代码:

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

The file, named "file.png" is stored in the "Resources" folder (within Visual Studio), and is marked as an embedded resource. 名为“ file.png”的文件存储在“资源”文件夹中(在Visual Studio中),并被标记为嵌入式资源。

The code fails with an exception saying: 该代码失败,并显示以下异常:

Resource MyNamespace.Resources.file.png cannot be found in class MyNamespace.MyClass 在类MyNamespace.MyClass中找不到资源MyNamespace.Resources.file.png

I have identical code (in a different assembly, loading a different resource) which works. 我有相同的代码(在不同的程序集中,加载了不同的资源)可以工作。 So I know the technique is sound. 所以我知道这项技术是合理的。 My problem is I end up spending a lot of time trying to figure out what the correct path is. 我的问题是我最终花费大量时间试图找出正确的路径。 If I could simply query (eg. in the debugger) the assembly to find the correct path, that would save me a load of headaches. 如果我可以简单地查询(例如在调试器中)程序集以找到正确的路径,那将为我省去很多麻烦。

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

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

I find myself forgetting how to do this every time as well so I just wrap the two one-liners that I need in a little class: 我发现自己也忘记了每次都该怎么做,因此我只把我需要的两个单线包装起来:

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

I'm guessing that your class is in a different namespace. 我猜您的课程位于其他名称空间中。 The canonical way to solve this would be to use the resources class and a strongly typed resource: 解决此问题的规范方法是使用资源类和强类型资源:

ProjectNamespace.Properties.Resources.file

Use the IDE's resource manager to add resources. 使用IDE的资源管理器添加资源。

I use the following method to grab embedded resources: 我使用以下方法来获取嵌入式资源:

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

I then call this with the path in the project: 然后,我将其与项目中的路径一起调用:

GetResourceStream(@"DirectoryPathInLibrary/Filename")

The name of the resource is the name space plus the "pseudo" name space of the path to the file. 资源的名称是名称空间加上文件路径的“伪”名称空间。 The "pseudo" name space is made by the sub folder structure using \\ (backslashes) instead of . 子文件夹结构使用\\(反斜杠)而不是来构成“伪”命名空间。 (dots). (点)。

public static Stream GetResourceFileStream(String nameSpace, String filePath)
{
    String pseduoName = filePath.Replace('\\', '.');
    Assembly assembly = Assembly.GetExecutingAssembly();
    return assembly.GetManifestResourceStream(nameSpace + "." + pseduoName);
}

The following call: 以下调用:

GetResourceFileStream("my.namespace", "resources\\xml\\my.xml")

will return the stream of my.xml located in the folder-structure resources\\xml in the name space: my.namespace. 将返回位于名称空间my.namespace中的文件夹结构resources \\ xml中的my.xml流。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM