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

时间:2009-01-11 16:35:41

标签: c# .net embedded-resource

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

有办法做到这一点吗?我假设有资源文件?

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

7 个答案:

答案 0 :(得分:142)

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

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

enter image description here

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

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

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

答案 1 :(得分:38)

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

这里的其他答案更方便。我将此包括在内是为了完整性。

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

答案 2 :(得分:30)

嵌入文本文件后,请使用该文件在代码中的任何位置......

global::packageName.Properties.Resources.ThatFileName

答案 3 :(得分:4)

是的,你是对的 - 创建一个资源文件。如果你这样做,你不需要“加载”字符串,它将被引用为Resource.WhateverStringYouDefined。

答案 4 :(得分:1)

这是我做的:

  1. 右键单击项目,在Visual Studio中添加了我的文件(资源)。
  2. 右键单击您添加的每个文件,并将“Build Type”更改为Embedded Resource。
  3. 要访问资源:

    一个。使用函数GetExecutingAssembly()

    获取当前程序集

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

    ℃。现在使用StreamReader()类将文件末尾读入变量,如果这是你想要的。

答案 5 :(得分:1)

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

在执行任何操作之前,请将文件包含在Visual Studio中的解决方案中。 (以我的VS 2017社区为例。)我切换到Solution Explorer,然后右键单击Properties文件夹,选择Add Existing Item并选择了文件。 (假设FileName.txt。)然后,在仍位于Solution Explorer中的情况下,右键单击包含的文件,选择Properties,然后选择Build Action作为Embedded 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();
    }
}

请注意,在这种情况下,您不需要将文件添加为accepted answer中建议的资源。

答案 6 :(得分:0)

添加到Pavan的答案,获取当前程序集(一般部分):

Assembly _assembly;

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

try
{
    _assembly = Assembly.GetExecutingAssembly();
    _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
}
catch
{
    Console.WritelLine("Error accessing resource!");
}