如何在.NET程序集中嵌入文本文件?

Ada*_*ile 117 .net c# embedded-resource

我想在程序集中嵌入一个文本文件,这样我就可以加载文本而无需从磁盘中读取它,因此我需要的所有东西都包含在exe中.(这样它更便携)

有没有办法做到这一点?我假设资源文件的东西?

如果可以的话,你是如何做到的,以及如何将文本加载到字符串中?

ang*_*son 146

右键单击项目文件,选择"属性".

在打开的窗口中,转到"资源"选项卡,如果它在选项卡页面中间只有一个蓝色链接,请单击它以创建新资源.

在此输入图像描述

然后从选项卡页面上方的工具栏中选择添加新文本文件,为其命名,将其添加到项目中并打开.

如果你做到这一点,那么在你的代码中你可以输入Resources.TheNameYouGaveTheTextFileHere并且你可以访问它的内容.请注意,第一次在类中使用Resources类时,需要添加using指令(在键入Resources之后按Ctrl +.获取菜单以让VS为您执行此操作).

如果对上述描述有些不清楚,请发表评论,我会对其进行编辑,直到完成或有意义:)

  • 啊哈,我需要做的就是添加一个My.到前面(即My.Resources.solutions)简单! (3认同)
  • 如果我以这种方式添加一个文本文件,并说该文本文件是我的解决方案的一部分...如果该文件得到更新并且我重建程序集,嵌入式资源也会得到更新吗?或者如果我更改了文件,我是否需要手动删除/重新添加该文件? (3认同)
  • 文件在编译时打包到资源中,而不是在添加时打包.您可以在任何您喜欢的工具中自由更改文件并重建,更改将成为您的程序集的一部分. (3认同)
  • 添加资源会生成并包含`Properties\Resources.Designer.cs`和`namespace YourProjectRootNamespace.Properties`,因此您必须使用`YourProjectRootNamespace.Properties`.`ProjectRootNamespace`在VisualStudio中的项目属性中定义. (2认同)

Dre*_*kes 38

在Visual Studio 2003,Visual Studio 2005以及可能的早期版本(这也适用于2008)中,您可以在项目中包含文本文件,然后在"属性"面板中将操作设置为"嵌入式资源".然后,您可以使用以流的形式访问该文件Assembly.GetManifestResourceStream(string).

这里的其他答案更方便.我把它包括在内是为了完整性.

请注意,此方法适用于嵌入其他类型的文件,如图像,图标,声音等...

  • 注意:使用namespace + filename作为GetManifestResourceStream()的参数,例如"MyNamespace.MyTextfile.txt".您还可以调用GetManifestResourceNames()来获取所有名称的列表. (8认同)

Nar*_*yal 31

嵌入文本文件后,在这样的代码中使用该文件...

global::packageName.Properties.Resources.ThatFileName
Run Code Online (Sandbox Code Playgroud)

  • 这是一种更好的方法,因为如果删除资源,它将抛出编译器错误.它还消除了拼写错误.谢谢你的帖子. (3认同)
  • 如果我想从变量中指定 `ThatFileName` 怎么办? (2认同)

c00*_*0fd 5

这对我有用。(我需要读取嵌入到可执行 .NET 图像文件中的文件的内容。)

在执行任何操作之前,请将您的文件包含到 Visual Studio 中的解决方案中。(在我的情况下是 VS 2017 社区。)我切换到Solution Explorer,然后右键单击Properties文件夹,选择Add Existing Item并选择文件。(比如说,FileName.txt。)然后在 中的同时Solution Explorer,右键单击包含的文件,选择Properties,然后选择Build ActionEmbedded Resource

然后使用此代码读取其字节:

string strResourceName = "FileName.txt";

Assembly asm = Assembly.GetExecutingAssembly();
using( Stream rsrcStream = asm.GetManifestResourceStream(asm.GetName().Name + ".Properties." + strResourceName))
{
    using (StreamReader sRdr = new StreamReader(rsrcStream))
    {
        //For instance, gets it as text
        string strTxt = sRdr.ReadToEnd();
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,在这种情况下,您不需要将该文件添加为已接受答案中建议的资源。