Embed Text File in Resources
我试图将文本文件嵌入到我的资源文件中的应用程序中。 我不久前一直在关注这个问题。
如何在.NET程序集中嵌入文本文件?
我将我的文本文件添加到Resources.resx中,但是不了解如何在代码中调用它。 如您所见,OP遇到相同的问题,并且设法使用
像这样嵌入文本资源似乎可行(Visual C#Express):
打开项目属性
浏览到资源,单击添加新项,然后选择创建或添加现有项(以正确的为准)。
出现野生资源文件夹
像这样使用它们:
1 2 | string foo = global::[ProjectName].Properties.Resources.Muistio; string bar = global::[ProjectName].Properties.Resources.asd; |
资源"构建"操作为"无","复制到输出目录"为"不复制"。
如果有人可以验证这一点很好,当exe传输到我的服务器2k8时它可以工作,但是我仍然希望独立验证。特别是因为ResourceHacker没有看到字符串。
将文本文件添加到项目中,然后将其定义为内容(
如果您有项目的安装程序(标准安装程序),则可以设置文件系统,以便安装程序自动复制文本文件。
要获取应用程序正在运行的文件夹,我可以这样:
如果您使用的是新安装程序(ClicOnce),我将无法为您提供帮助,但我希望您好运:=)
如果文件很小,则可以按照其他人的描述使用项目资源文件,但是那样只能将文件作为Unicode字符串检索,可能/可能比原始文件大两倍,并立即全部加载到内存中。 。
原始问题中提到的方法是将文本文件放在项目中的某个位置,在解决方案资源管理器中将其选中,按F4键显示"属性",然后将"构建操作"设置为"嵌入式"资源,然后将"复制"保留到"不复制"的输出目录。
这与添加到.csproj中相同:
1 2 3 | <ItemGroup> <EmbeddedResource Include="Resources\TextFile.txt"/> </ItemGroup> |
然后,您将需要一个正确的
通过组装:
1 2 3 |
这些名称类似于类名,以点分隔。如果您的项目是
1 | NamespaceName.ProjectName.Resources.TextFile.txt |
永远不要依赖默认的名称空间或项目输出文件名。
不利的一面是它们在手表窗口中似乎无法正常工作。你可能会例外
1 | System.ArgumentException"Cannot evaluate a security function." |
在这种情况下,只需将代码编写在可以随意执行的位置(例如,使用静态方法)。因此该代码从您的程序集运行,而不是从调试器运行。
并通过
1 2 3 4 5 6 7 8 | dotnet add package Microsoft.Extensions.FileProviders.Embedded using Microsoft.Extensions.FileProviders; var fp = new EmbeddedFileProvider(typeof(Program).Assembly); // get all resources as an enumerable foreach (var fileInfo in fp.GetDirectoryContents("")) Console.WriteLine($"Name: {fileInfo.Name}, Length: {fileInfo.Length}, ..."); // get a specific one by name var stream = fp.GetFileInfo("Resources.TextFile.txt").CreateReadStream(); |
作为
使用.ResX资源与将文本文件嵌入到程序集中稍有不同。对于后者,您要检查其属性并将其设置为EmbeddedResource(即,无需向ResX文件添加任何内容,只需将文本文件放入VS Project中即可)。要检索它,请使用此命令:
1 | Assembly.GetExecutingAssembly().GetManifestResourceStream(name); |
要获取name参数的正确值,请调用GetManifestResourceNames()并检查结果。