C# 如何在.NET程序集中嵌入文本文件?
我想在程序集中嵌入一个文本文件,这样我就可以加载文本而不必从磁盘读取它,这样我所需要的一切都包含在exe中。(这样更便于携带) 有办法做到这一点吗?我假设资源文件有问题C# 如何在.NET程序集中嵌入文本文件?,c#,.net,embedded-resource,C#,.net,Embedded Resource,我想在程序集中嵌入一个文本文件,这样我就可以加载文本而不必从磁盘读取它,这样我所需要的一切都包含在exe中。(这样更便于携带) 有办法做到这一点吗?我假设资源文件有问题 如果可以,您是如何做到的,以及如何通过编程将文本加载到字符串中?是的,您是正确的-创建一个资源文件。执行此操作时,不需要“加载”字符串,它将被引用为资源。您定义了什么内容。右键单击项目文件,选择“属性” 在打开的窗口中,转到“资源”选项卡,如果在选项卡页中间有一个蓝色链接,单击它,创建一个新的资源。 然后从选项卡页面上方的工具
如果可以,您是如何做到的,以及如何通过编程将文本加载到字符串中?是的,您是正确的-创建一个资源文件。执行此操作时,不需要“加载”字符串,它将被引用为资源。您定义了什么内容。右键单击项目文件,选择“属性” 在打开的窗口中,转到“资源”选项卡,如果在选项卡页中间有一个蓝色链接,单击它,创建一个新的资源。 然后从选项卡页面上方的工具栏中,选择添加一个新文本文件,给它一个名称,它将被添加到项目中并打开 如果您做到了这一点,那么您可以在代码中键入Resources.thenameyougavethetextfile,然后您可以访问它的内容。请注意,第一次在类中使用Resources类时,需要添加一个using指令(在键入Resources后,点击Ctrl+,获得菜单,让VS为您执行此操作)
如果上面的描述不清楚,请留下评论,我将对其进行编辑,直到其完整或有意义:)在Visual Studio 2003、Visual Studio 2005以及可能更早的版本(2008年也适用)中,您可以在项目中包含文本文件,然后在“属性”面板中,将操作设置为“嵌入式资源”。然后,您可以使用
Assembly.GetManifestResourceStream(string)
以流的形式访问该文件
这里的其他答案更方便。为了完整性,我将其包括在内
请注意,这种方法适用于嵌入其他类型的文件,如图像、图标、声音等。嵌入文本文件后,在代码中的任何位置使用该文件…
global::packageName.Properties.Resources.ThatFileName
以下是我所做的:
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();
}
}