是否有更简单的语法来访问程序集中嵌入的资源?

时间:2012-04-12 21:17:32

标签: c# .net .net-4.0

现在我在课堂上有一些:

string upgrade_file 
    = new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(
        Assembly.GetExecutingAssembly().GetName().Name 
        + ".schemas.template.db_upgrades.txt")
        ).ReadToEnd();

我可以编写一个包装器函数来简化对嵌入式资源的访问(如果必须的话,我会这样做),但是有更简单或更优雅的方式来使用.Net本地访问它们吗?

例如,我发现GetManifestResourceStream(...)不是静态的很奇怪。另一个例子:是否有一些方法返回字符串而不是文本文件的流?

更新1

要清楚,我在子目录中有文本文件,我想要:

  1. 这些文件仍然是单独的文件(例如,能够单独控制它们)
  2. 这些文件仍然是嵌入式资源,即使用程序集编译。
  3. 现在我正在执行此操作,如下图所示: enter image description here

    更新2

    我没有设法使用答案中的任何内容来简化访问文件。

    以下是我正在使用的帮助方法,以防其他人发现它有用:

    /// <summary>
    /// Get the content of a text file embedded in the enclosing assembly.
    /// </summary>
    /// <param name="resource">The "path" to the text file in the format 
    /// (e.g. subdir1.subdir2.thefile.txt)</param>
    /// <returns>The file content</returns>
    static string GetEmbeddedTextFile(string resource)
    {
        return new StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(
            Assembly.GetExecutingAssembly().GetName().Name + "." + resource)).ReadToEnd();
    }
    

4 个答案:

答案 0 :(得分:0)

我的项目中有一个名为Resource1的资源文件,其中包含TXT文件和二进制文件 我能够做到

string str = Resource1.TxtFile;
byte[] file = Resource1.BinaryFile;

答案 1 :(得分:0)

您是否知道在VS中,如果您有一个Resources.resx文件,它会生成一个真正的类代码?您可以查看它并直接使用它而无需任何元操作。

如果双击Rsources.resx文件并打开设计器,则可以找到一个下拉列表,如果您的目的需要,则会将生成的类的访问权限从内部更改为公共。

答案 2 :(得分:0)

我个人的方法是为Assembly类编写一个扩展,因为这似乎是一个应该包含在该类中的方法。

因此,如上所述,首先确保您的文本文件被标记为“Embedded Resource”,然后使用类似于以下内容的代码:

public static class Extensions
{
    public static string ReadTextResource(this Assembly asm, string resName)
    {
        string text;
        using (Stream strm = asm.GetManifestResourceStream(resName))
        {
            using (StreamReader sr = new StreamReader(strm))
            {
                text = sr.ReadToEnd();
            }
        }
        return text;
    }
}

这允许您使用以下代码加载DLL或您希望的任何程序集:

        string content = Assembly.GetExecutingAssembly().ReadTextResource(myResourceName);

(上面的内容可以更简洁地编码,但为了演示的目的,我还是这样做了)

答案 3 :(得分:-2)

string upgrade_file  = Resources.db_upgrades.txt