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

C# 如何在.NET程序集中嵌入文本文件?,c#,.net,embedded-resource,C#,.net,Embedded Resource,我想在程序集中嵌入一个文本文件,这样我就可以加载文本而不必从磁盘读取它,这样我所需要的一切都包含在exe中。(这样更便于携带) 有办法做到这一点吗?我假设资源文件有问题 如果可以,您是如何做到的,以及如何通过编程将文本加载到字符串中?是的,您是正确的-创建一个资源文件。执行此操作时,不需要“加载”字符串,它将被引用为资源。您定义了什么内容。右键单击项目文件,选择“属性” 在打开的窗口中,转到“资源”选项卡,如果在选项卡页中间有一个蓝色链接,单击它,创建一个新的资源。 然后从选项卡页面上方的工具

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

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


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

是的,您是正确的-创建一个资源文件。执行此操作时,不需要“加载”字符串,它将被引用为资源。您定义了什么内容。

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

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

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

如果您做到了这一点,那么您可以在代码中键入Resources.thenameyougavethetextfile,然后您可以访问它的内容。请注意,第一次在类中使用Resources类时,需要添加一个using指令(在键入Resources后,点击Ctrl+,获得菜单,让VS为您执行此操作)


如果上面的描述不清楚,请留下评论,我将对其进行编辑,直到其完整或有意义:)

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

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


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

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

global::packageName.Properties.Resources.ThatFileName
以下是我所做的:

  • 通过右键单击项目,在Visual Studio中添加了我的文件(资源)
  • 右键单击您添加的每个文件,并将“构建类型”更改为嵌入式资源
  • 要访问资源,请执行以下操作:

    a。使用函数获取当前程序集:
    getExecutionGassembly()

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

    c。现在使用
    StreamReader()
    类将文件末尾的内容读入变量(如果您需要的话)


  • 除了Pavan的回答之外,获取当前大会的信息(一般部分):

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


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

    在执行任何操作之前,请将文件包含到VisualStudio中的解决方案中。(在我的案例VS 2017社区中)我切换到
    解决方案资源管理器
    ,然后右键单击
    属性
    文件夹,选择
    添加现有项目
    ,并选择文件。(比如,
    FileName.txt
    )然后在
    解决方案资源管理器中,右键单击包含的文件,选择
    属性
    ,然后选择
    构建操作
    作为
    嵌入资源

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

    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();
        }
    }
    

    请注意,在这种情况下,您不需要像中所建议的那样将该文件添加为资源。

    使用指令代码是什么样子的,我正在努力实现这一点。我已经添加了solutions.txt作为一个资源,但是它找不到Resources.solutions-我觉得我错过了using指令。啊哈,我所需要做的就是添加一个我的。到前面(即我的资源、解决方案)简单!添加资源会生成并包括
    Properties\Resources.Designer.cs
    名称空间YourProjectRootNamespace.Properties
    ,因此必须使用
    YourProjectRootNamespace.Properties
    ProjectRootNamespace
    在VisualStudio中的项目属性中定义。如果我以这种方式添加一个文本文件,并说该文本文件是我的解决方案的一部分…如果该文件得到更新并且我重新生成程序集,嵌入的资源也会得到更新吗?或者,如果我更改了文件,是否需要手动删除/重新添加该文件?文件在编译时打包到资源中,而不是在添加它们时打包到资源中。您可以在任何喜欢的工具中自由更改文件并重新生成,更改将成为程序集的一部分。注意:使用命名空间+文件名作为GetManifestResourceStream()的参数,例如“MyNamespace.MyTextfile.txt”。您还可以调用GetManifestResourceNames()来获取所有名称的列表。这是一种更好的方法,因为如果删除资源,它将抛出编译器错误。它还消除了打字错误。谢谢你的来信。我可以将它写回C#DLL级别的文件吗?如果我想从变量中指定
    ThatFileName
    ,该怎么办?
    try
    {
        _assembly = Assembly.GetExecutingAssembly();
        _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("*Namespace*.*FileName*.txt"));
    }
    catch
    {
        Console.WritelLine("Error accessing 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();
        }
    }