在资源中嵌入文本文件

时间:2012-06-25 08:35:10

标签: c# wpf visual-studio-2010 embedded-resource

我试图在我的资源文件中将文本文件嵌入到我的应用程序中。我回复了一段时间后回答了这个问题;

How to embed a text file in a .NET assembly?

我将我的Text文件添加到Resources.resx中,但无法理解如何在代码中调用它。正如您所看到的,OP遇到了同样的问题,并设法使用My.Resources.TEXTFILENAME使其工作,而不是Resources.TEXTFILENAME的最佳答案建议。不幸的是,我的应用程序中没有被识别,我尝试添加使用,但VS并没有暗示任何。单独编写Resources,它将其识别为ResourceDictionary和FrameworkElement.Resources,但没有文本文件......任何想法?

4 个答案:

答案 0 :(得分:9)

嵌入这样的文本资源似乎有用(visual c#express):

  1. 打开项目属性
    enter image description here

  2. 浏览资源,点击添加新资源,然后选择创建或添加现有资源,无论哪个为真。 enter image description here

  3. 出现一个野生资源文件夹 enter image description here

  4. 像这样使用它们:

    string foo = global::[ProjectName].Properties.Resources.Muistio;
    string bar = global::[ProjectName].Properties.Resources.asd;
    
  5. 资源构建操作,复制到输出目录不复制

    如果有人可以验证这一点会很好,当exe转移到我的服务器2k8时它会工作,但我仍然需要独立验证。特别是因为ResourceHacker没有看到字符串。

答案 1 :(得分:5)

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

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

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

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

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

答案 2 :(得分:1)

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

Assembly.GetExecutingAssembly().GetManifestResourceStream(name);

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

答案 3 :(得分:0)

如果文件很小,项目资源文件可以按照其他人的描述使用,但是这样只能将文件检索为Unicode字符串,可能/可能是原始文件的两倍,并一次加载到内存中完整的。

原始问题中提到的方法是将文本文件放在项目中的某个位置,在解决方案资源管理器中选择它,按F4显示属性,然后将构建操作设置为嵌入式资源并将复制到输出目录保留在不要复制

这与添加到.csproj相同:

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

然后,您需要使用正确的AssemblyIFileProvider的实例来按名称访问这些资源。

通过大会:

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网站。