net core 2.0 读取文件添加为资源

Posted

技术标签:

【中文标题】net core 2.0 读取文件添加为资源【英文标题】:net core 2.0 read file added as resources 【发布时间】:2018-07-25 11:00:39 【问题描述】:

我正在做一个 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 为空。

第二个

var byteArray = Resources.portsettings;

返回一个字节数组,但我无法将这些字节数组转换为 json。

我的问题是如何让它工作。在我编译这些项目时保存 json 文件,或者将其保存为资源文件并能够读取它。

谢谢

【问题讨论】:

【参考方案1】:

您可以使用以下内容读取嵌入的资源。

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

【讨论】:

流为空。我用另一种方式解决了...谢谢 @Diego 你是怎么解决的,你确定你将这些文件嵌入到属性中? 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")) 也许我写错了..但它是空的....谢谢 @Diego 在我的情况下,我会通过ServiceLayer.Resources.Request.GetRainRequest.txt。您必须使用扩展名获取整个命名空间、路径和名称。 谢谢....在您的情况下,“ServiceLayer”是命名空间。“Resources”是 Resources.resx 的名称。“GetRainRequest.txt”是文本......而“Request”是什么它?谢谢....【参考方案2】:

我解决了将json 文件保存在DebugPublish 目录中的问题,方法是将.json 文件属性Copy to Output Directory 设置为Always,如here 所说。

我还在this教程之后添加了资源文件

我不认为它是最好的方法,但它是最简单的。

【讨论】:

以上是关于net core 2.0 读取文件添加为资源的主要内容,如果未能解决你的问题,请参考以下文章

.Net Core 读取文件时中文乱码问题的解决方法

如何在.Net Core 2.0 App中读取appsettings.json

.Net Core控制台应用加载读取Json配置文件

.Net Core Web应用加载读取Json配置文件

net core 简单读取json配置文件

.Net Core系列:读取配置文件