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


118

我想将文本文件嵌入到程序集中,这样就可以加载文本而不必从磁盘读取文本,并且我需要的所有内容都包含在exe中。(以便更便携)

有没有办法做到这一点?我认为资源文件有什么用?

如果可以的话,如何做以及如何以编程方式将文本加载到字符串中?

Answers:


147

右键单击项目文件,选择“属性”。

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

在此处输入图片说明

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

如果到此为止,则可以在代码中键入Resources.TheNameYouGaveTheTextFileHere,然后访问其内容。请注意,第一次在类中使用Resources类时,需要添加using指令(在键入Resources获得菜单以使VS为您完成操作后,按Ctrl +。)。

如果上述说明不清楚,请留下评论,我将对其进行编辑,直到完成或有意义为止:)


1
“使用”指令代码将是什么样子,我正在努力使之工作。我已经将solutions.txt添加为资源,但是找不到Resources.solutions-我觉得我缺少了using指令。
Spedge

3
啊哈,我要做的就是添加一个My。到最前面(即My.Resources.solutions)简单!
Spenge

2
添加一个资源产生,包括Properties\Resources.Designer.csnamespace YourProjectRootNamespace.Properties,所以你必须使用YourProjectRootNamespace.PropertiesProjectRootNamespace在VisualStudio中的项目属性中定义。
ilyaigpetrov 2014年

1
如果我以这种方式添加文本文件,并说该文本文件是我的解决方案的一部分...如果该文件被更新并重新生成程序集,嵌入式资源是否也将被更新?还是如果我更改了文件,是否需要手动删除/重新添加文件?
Peter Tirrell

3
文件在编译时(而不是在添加时)打包到资源中。您可以在任何喜欢的工具中自由更改文件并进行重建,这些更改将成为程序集的一部分。
Lasse V. Karlsen

38

在Visual Studio 2003,Visual Studio 2005以及可能的早期版本中(在2008年同样适用),您可以在项目中包含文本文件,然后在“属性”面板中,将操作设置为“嵌入资源”。然后,您可以使用来作为流访问文件Assembly.GetManifestResourceStream(string)

这里的其他答案更方便。为了完整起见,我将其包括在内。

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


8
注意:使用名称空间+文件名作为GetManifestResourceStream()的参数,例如“ MyNamespace.MyTextfile.txt”。您还可以调用GetManifestResourceNames()以获取所有名称的列表。
Stiefel

32

嵌入文本文件后,可以在代码中的任何位置使用该文件,如下所示...

global::packageName.Properties.Resources.ThatFileName

3
这是一种更好的方法,因为如果删除资源,它将引发编译器错误。它还消除了错别字。感谢您的帖子。
Ben Gripka

+5。我可以将其写回到C#DLL级别的文件中吗?
Prajwal Bhat

1
如果ThatFileName要从变量指定怎么办?
c00000fd


2

这对我有用。(我需要读取嵌入到可执行.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();
    }
}

注意,在这种情况下,你并不需要该文件作为资源添加作为提出接受的答案


1

这是我所做的:

  1. 通过在项目上单击鼠标右键,在Visual Studio中添加了我的文件(资源)。
  2. 右键单击添加的每个文件,然后将“构建类型”更改为“嵌入式资源”。
  3. 为了访问资源:

    一个。使用以下函数获取当前程序集:GetExecutingAssembly()

    b。我添加的资源是一个文本文件,因此我使用将该文件读入流中GetManifestResourceStream(fileName)。我访问文件名的方式是通过调用GetManifestResourceNames()

    C。现在,StreamReader()如果需要的话,使用一个类将文件的末尾读入变量。


0

添加到Pavan的答案中,以获取当前的程序集(在常规部分中):

Assembly _assembly;

GetManifestResourceStream(文件名)(在代码中,需要从资源中读取):

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}
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.