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

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

有什么办法吗? 我猜是和资源文件有关吧?

如果可以的话,您如何做到这一点,以及如何通过编程将文本加载到字符串中?

101130 次浏览

是的,你是正确的-创建一个资源文件。当您这样做时,您不需要“加载”字符串,它将被引用为资源。随便你怎么定义。

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

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

enter image description here

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

如果您已经了解了这么多,那么可以在代码中键入参考资料。TheNameYouGaveTheTextFileHere,你可以访问它的内容。注意,第一次在类中使用 Resources 类时,需要添加 using 指令(单击 Ctrl + 。输入参考资料以获得菜单,然后让 VS 为您完成这项工作)。

如果对上述描述有不清楚的地方,请留下评论,我会编辑它,直到它完整或有意义:)

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

这里的其他答案更方便,我包含这个是为了完整。

注意,这种方法可以用于嵌入其他类型的文件,如图像、图标、声音等。

在嵌入一个文本文件之后,像这样在代码的任何地方使用该文件..。

global::packageName.Properties.Resources.ThatFileName

我是这么做的:

  1. 通过右键单击项目添加 VisualStudio 中的文件(资源)。
  2. 右键单击您添加的每个文件,并将“ Build Type”更改为嵌入式资源。
  3. 为了访问资源:

    使用函数 GetExecutingAssembly()得到当前程序集

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

    C.现在,如果需要的话,可以使用 StreamReader()类将文件读取到变量的末尾。

对于帕万的答案,获取当前程序集(一般情况下) :

Assembly _assembly;

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

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

以下是对我有用的方法(我需要读取嵌入到可执行.NET 映像文件中的文件的内容)

在执行任何操作之前,请将文件包含到 VisualStudio 中的解决方案中。(在我的案例中 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();
}
}

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