关于资源中的c#:嵌入文本文件

Embed Text File in Resources

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

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

我将我的文本文件添加到Resources.resx中,但是不了解如何在代码中调用它。 如您所见,OP遇到相同的问题,并且设法使用My.Resources.TEXTFILENAME使它工作,而不是Resources.TEXTFILENAME的最佳答案建议。 不幸的是,我的应用程序都无法识别它们,并且我尝试添加uses,但是VS没有任何建议。 单独编写Resources时,它会将其识别为ResourceDictionary和FrameworkElement.Resources,但没有文本文件...有什么想法吗?


像这样嵌入文本资源似乎可行(Visual C#Express):

  • 打开项目属性
    enter image description here

  • 浏览到资源,单击添加新项,然后选择创建或添加现有项(以正确的为准)。
    enter image description here

  • 出现野生资源文件夹
    enter image description here

  • 像这样使用它们:

    1
    2
    string foo = global::[ProjectName].Properties.Resources.Muistio;
    string bar = global::[ProjectName].Properties.Resources.asd;
  • 资源"构建"操作为"无","复制到输出目录"为"不复制"。

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


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

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

    要获取应用程序正在运行的文件夹,我可以这样:

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

    如果您使用的是新安装程序(ClicOnce),我将无法为您提供帮助,但我希望您好运:=)


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

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

    这与添加到.csproj中相同:

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

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

    通过组装:

    1
    2
    3
    typeof(Program).Assembly.GetManifestResourceNames()
    typeof(Program).Assembly.GetManifestResourceStream(name)
    typeof(Program).Assembly.GetManifestResourceInfo(name)

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

    1
    NamespaceName.ProjectName.Resources.TextFile.txt

    GetManifestResourceStream的重载带有类型,因此您可以执行

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

    永远不要依赖默认的名称空间或项目输出文件名。

    不利的一面是它们在手表窗口中似乎无法正常工作。你可能会例外

    1
    System.ArgumentException"Cannot evaluate a security function."

    在这种情况下,只需将代码编写在可以随意执行的位置(例如,使用静态方法)。因此该代码从您的程序集运行,而不是从调试器运行。

    并通过IFileProvider

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

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


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

    1
    Assembly.GetExecutingAssembly().GetManifestResourceStream(name);

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