4

我试图将文本文件嵌入到我的资源文件中的应用程序中。不久前我一直在关注这个问题;

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

我将我的文本文件添加到 Resources.resx,但无法理解如何在代码中调用它。正如您所看到的,OP 遇到了同样的问题,并设法使其工作My.Resources.TEXTFILENAME,而不是Resources.TEXTFILENAME. 不幸的是,在我的应用程序中两者都没有被识别,我已经尝试添加 usings 但 VS 没有提出任何建议。自己编写Resources,它将其识别为 ResourceDictionary 和 FrameworkElement.Resources,但没有文本文件......有什么想法吗?

4

4 回答 4

12

像这样嵌入文本资源似乎可行(visual c# express):

  1. 打开您的项目属性
    在此处输入图像描述

  2. 浏览到资源,单击添加新并选择创建或添加现有资源,以正确者为准。 在此处输入图像描述

  3. 出现一个野生资源文件夹 在此处输入图像描述

  4. 像这样使用它们:

    string foo = global::[ProjectName].Properties.Resources.Muistio;
    string bar = global::[ProjectName].Properties.Resources.asd;
    

资源 Build 操作是None并且 Copy to output directory 是Do not copy

如果有人可以验证这一点,那就太好了,当 exe 传输到我的服务器 2k8 时它可以工作,但我仍然想要独立验证。特别是因为 ResourceHacker 没有看到字符串。

于 2014-05-15T06:09:07.620 回答
6

将文本文件添加到您的项目中,然后将其定义为内容 ( Build Action= Content) 和Copy always输出。

如果您有项目的安装程序(标准安装程序),您可以设置文件系统,以便安装程序自动复制文本文件。

要获取运行应用程序的文件夹,我使用这个:

Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly.Location);

如果您使用的是新的安装程序(ClicOnce),我无法帮助您,但祝您好运:=)

于 2012-06-25T16:33:36.033 回答
3

如果文件很小,则可以按照其他人的描述使用项目资源文件,但是这样只能将文件作为 Unicode 字符串检索,可能/可能比原始文件大两倍,并立即将其全部加载到内存中.

原始问题中提到的方法是将文本文件放在项目中的某个位置,在解决方案资源管理器中选择它,按 F4 以显示属性,然后将Build Action设置为Embedded resource并将Copy to output directory保留为Do not copy

这与添加到 .csproj 相同:

<ItemGroup>
    <EmbeddedResource Include="Resources\TextFile.txt"/>
</ItemGroup>

然后,您将需要一个正确的实例Assembly,或者一个IFileProvider按名称访问这些资源的实例。

通过组装:

typeof(Program).Assembly.GetManifestResourceNames()
typeof(Program).Assembly.GetManifestResourceStream(name)
typeof(Program).Assembly.GetManifestResourceInfo(name)

这些名称是类似的类名,以点分隔。如果您的项目是NamespaceName.ProjectName,资源文件在Resources子文件夹中并被调用TextFile.txt,则资源名称将是

NamespaceName.ProjectName.Resources.TextFile.txt

有一个重载GetManifestResourceStream需要一个类型,所以你可以做

typeof(Program).Assembly.GetManifestResourceStream(
    typeof(Program),
    "Resources.TextFile.txt")

从不依赖默认命名空间或项目输出文件名。

这些的缺点是它们似乎无法从手表窗口工作。您可能会遇到异常

System.ArgumentException "Cannot evaluate a security function."

在这种情况下,只需在可以随意执行它的地方编写该代码 - 例如在静态方法中。因此该代码从您的程序集运行,而不是调试器。

并通过IFileProvider

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

作为IFileProvider.NET Core 网站,您可能会尝试从纯嵌入式资源托管。

于 2017-08-29T19:18:49.503 回答
2

使用 .ResX 资源与将文本文件嵌入到程序集中略有不同。对于后者,您要检查其属性并使其成为EmbeddedResource(即,无需向 ResX 文件添加任何内容,只需将文本文件放入您的 VS 项目中)。要检索它,请使用:

Assembly.GetExecutingAssembly().GetManifestResourceStream(name);

要获取name参数的正确值,请调用GetManifestResourceNames()并检查结果。

于 2012-06-25T08:40:59.503 回答