.NET Core 2.0将文件添加为资源后如何读取?

6
我正在开发一个C# Net Core 2.0应用程序... 我有一个.sln文件,其中包含几个控制台项目,称为PrjA、PrjB、PrjC,它们将在不同的端口上运行,端口5000、端口5010、端口5020。它们通过控制台并行运行。
C:>dotnet PrjA.dll
C:>dotnet PrjB.dll
C:>dotnet PrjC.dll

我有另一个名为PrjCommon的库项目,被所有三个项目引用。在这个项目中,我希望有一个对所有三个项目都通用的配置文件。

这个文件是一个名为portsettings.jsonjson文件。

当我以Debug模式运行这些项目或生成Publish folder时,portsettings.json文件不会保存。

PrjCommon项目中,我尝试将portsettings.json作为一个文件嵌入到Resources.resx中。

从这三个项目中的任何一个,我都调用了PrjCommon中应该读取portsettings.json文件的方法。

我已经尝试过两种方式从Resources.resx中读取此文件。

首先是这样的:

var assembly = Assembly.GetEntryAssembly();
 string[] names = assembly.GetManifestResourceNames();

但是names为null。

第二个问题

var byteArray = Resources.portsettings;

该函数返回一个字节数组,但我无法将这些字节数组转换为JSON格式。

我的问题是如何使其工作。无论是在编译项目时保存JSON文件,还是将其保存为资源文件并能够读取它。

谢谢

2个回答

6
您可以使用以下方法读取嵌入的资源。
public static class EmbeddedResource
{
    public static string[] GetApiRequestFile(string namespaceAndFileName)
    {
        try
        {
            using (var stream = typeof(EmbeddedResource).GetTypeInfo().Assembly.GetManifestResourceStream(namespaceAndFileName))
            using (var reader = new StreamReader(stream, Encoding.UTF8))
                return reader.ReadToEnd().Split(';');
        }

        catch(Exception exception)
        {
            ApplicationProvider.WriteToLog<EmbeddedResource>().Error(exception.Message);
            throw new Exception($"Failed to read Embedded Resource {namespaceAndFileName}");
        }
    }
}

因此,在我的情况下,我想要读取包含URL的嵌入式文本文件,我会对它们进行格式化,主要作为模板。但您正在寻找的逻辑应该是首先进行流线型处理。
Solution - Opti
Folder   - Resource
File     - RequestUrl.txt

如果我的课程中有一个文本文件,那么与该文件相关的命名空间将是Opti.Resource.RequestUrl.txt

Folder Structure

Calling the embedded resource


2
流为空。我用另一种方法解决了...谢谢 - Diego
@Diego 你是如何解决的?你确定在属性中将这些文件设置为嵌入式资源了吗? - Greg
Greg,我添加了一个resources.resx文件,并添加了一个名为portsettings.json的文件。我的命名空间是“INOM.Support.Comm”。也许当你说“namespaceAndFileName”时,我写错了,我把它写成了“INOM.Support.Comm.portsettings”。我的资源文件叫做Resource。所以我的代码是: var stream = typeof(Resource).GetTypeInfo().Assembly.GetManifestResourceStream("INOM.Support.Comm.portsettings")) 可能我写错了,但是它返回的是null...谢谢。 - Diego
3
在我的情况下,我会通过 ServiceLayer.Resources.Request.GetRainRequest.txt。您需要获取整个命名空间、路径和带有扩展名的名称。 - Greg
谢谢...在你的情况下,“ServiceLayer”是命名空间。“Resources”是Resources.resx的名称。“GetRainRequest.txt”是文本,而“Request”是什么?谢谢... - Diego
显示剩余3条评论

1

我解决了将json文件保存在DebugPublish目录中的问题,方法是将.json文件属性设置为始终复制到输出目录,如此处所述。

我还按照教程添加了资源文件。

我不知道这是否是最好的方法,但这是最简单的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接