Обложка канала

.NET Разработчик

Опытный разработчик не так давно зашёл в .Net и поставил цель получить сертификат Microsoft. Свой ежедневный прогресс он описывает на канале .Net Разработчик. Заметки об изученном материале, советы по повышению производительности и поддержке мотивации, ин

.NET Разработчик

4 года назад
Открыть в
День 1145. #ЗаметкиНаПолях Использование Встроенных Файлов в dotnet core Мы хотим прочитать файл JSON с диска. Мы не хотим полагаться на абсолютные пути к файлам, параметрам среды, копировать файлы в выходной каталог и т.п. Файл JSON выглядит следующим образом:
file.json
{
  "data": true
}

Можно использовать функцию EmbeddedResource. Тогда при сборке проекта файл json будет включён в dll. Чтобы пометить файл как EmbeddedResource, вы просто добавляете его в свой .csproj следующим образом:
<ItemGroup>
  <EmbeddedResource Include="Data\file.json" />
</ItemGroup>

Теперь посмотрим, как можно прочитать этот файл. При работе со встроенными файлами нам понадобится сборка, в которой мы будем искать встроенные ресурсы. Рассмотрим следующий интерфейс, содержащий методы для чтения встроенных ресурсов тремя различными способами
public interface IEmbeddedResourceQuery
{
  // изнутри сборки
  Stream? Read<T>(string resource);
  // из заданной сборки
  Stream? Read(Assembly a, string resource);
  // из сборки по имени сборки
  Stream? Read(string name, string resource);
}

Для получения потока для чтения ресурса можно использовать метод GetManifestResourceStream сборки. Ещё одна важная деталь — это то, как строится путь для чтения ресурса. Нам нужно указать имя сборки (MyLibrary), а затем использовать запись пути через точку:
Assembly_name.Folder.Filename
Например, для файла file.json в папке Data путь будет:
MyLibrary.Data.file.json

public class EmbeddedResourceQuery
 : IEmbeddedResourceQuery
{
  public Stream? Read<T>(string resource)
  {
    var a = typeof(T).Assembly;
    return ReadInternal(a, resource);
  }

  public Stream? Read(
   Assembly a, string resource)
  {
    return ReadInternal(a, resource);
  }

  public Stream? Read(
   string name, string resource)
  {
    var a = Assembly.Load(name);
    return ReadInternal(a, resource);
  }

  internal static Stream? ReadInternal(
   Assembly a, string resource)
  {
    return assembly
      .GetManifestResourceStream(
        $"{a.GetName().Name}.{resource}");
  }
}

Использование
var q = new EmbeddedResourceQuery();

// изнутри сборки
var s1 = q.Read<MyType>("Data.file.json ");

// из заданной сборки
var a = Assembly.Load("MyLibrary");
var s2 = q.Read(a, "Data.file.json ");

// из сборки по имени сборки
var s3 = q.Read("MyLibrary", "Data.file.json");

Источник: josef.codes/using-e…net-core