Встроенный ресурс в .Net Core library

Я только начал изучать .Net Core, и я не вижу классических ресурсов и всего, что похоже на ресурсы. В классических библиотеках классов .Net мне удалось добавить, например, текстовые файлы с некоторым script в мой проект, чем я могу добавить эти файлы в ресурсы проекта. После этого я мог бы легко использовать это следующим образом:

Connection.Execure(Properties.Resources.MySuperScript);

Я вижу, что в библиотеках .Net Core нет такой функции, по крайней мере, я не вижу. Есть ли альтернатива в .Net Core для хранения некоторых статических данных в виде встроенного ресурса в библиотеках? И как использовать это, если он существует?

Ответы

Ответ 1

ОБНОВИТЬ:

.NET Core 1.1 и более поздние версии .csproj project.json и вернулись в файлы .csproj. Это меняет Шаг 2, но не так сильно. Нужные строки очень похожи:

<ItemGroup>
  <Content Remove="_fonts/OpenSans.ttf" />
  <Content Remove="_fonts/OpenSans-Bold.ttf" />
  <Content Remove="_fonts/OpenSans-Italic.ttf" />
</ItemGroup>
<ItemGroup>
  <EmbeddedResource Include="_fonts/OpenSans.ttf" />
  <EmbeddedResource Include="_fonts/OpenSans-Bold.ttf" />
  <EmbeddedResource Include="_fonts/OpenSans-Italic.ttf" />
</ItemGroup>

Там может быть похожая форма *.tff; неподтвержденными.

Шаги 1 и 3 без изменений.


Чтобы использовать встроенные ресурсы в проекте .NET Core 1.0, сделайте следующее:

1.- Добавьте ваш встроенный файл (ы), как обычно.

Пример: некоторые файлы FONT в каталоге с именем "_fonts"

enter image description here

2.- Измените "project.json", чтобы включить связанные ресурсы.

В моем случае:

 "buildOptions": {
    "embed": {
      "include": [
        "_fonts/*.ttf"    
      ]
    } 
  },

3.- Доступ к встроенному ресурсу в коде.

var assembly = typeof(MyLibrary.MyClass).GetTypeInfo().Assembly;
Stream resource = assembly.GetManifestResourceStream("MyLibrary._fonts.OpenSans.ttf");

Ключевым моментом является использование правильного имени при вызове GetManifestResourceStream. Вы должны использовать [имя сборки]. [Каталог]. [Имя файла].

Надеюсь, это поможет кому-то там ^ _ ^.

Ответ 2

Теперь, когда project.json устарел, вы должны указать это в файле .csproj.

<ItemGroup>
    <EmbeddedResource Include="_fonts\*.ttf" />
</ItemGroup>

Вы можете использовать подстановочный знак, как показано, или просто явно указать файлы.

Ответ 3

Люди уже обычно отвечают на это, так что это перевод ответов в нечто простое.

Перед использованием следующего, файл должен быть добавлен как встроенный ресурс в .csproj/project.json

использование

var myJsonFile = ReadManifestData<Tests>("myJsonFile.json");
  1. Параметр: имя встроенного имени файла; Тип: любой класс из целевой сборки ресурсов
  2. ищет встроенный ресурс с этим именем
  3. возвращает строковое значение

метод

public static string ReadManifestData<TSource>(string embeddedFileName) where TSource : class
{
    var assembly = typeof(TSource).GetTypeInfo().Assembly;
    var resourceName = assembly.GetManifestResourceNames().First(s => s.EndsWith(embeddedFileName,StringComparison.CurrentCultureIgnoreCase));

    using (var stream = assembly.GetManifestResourceStream(resourceName))
    {
        if (stream == null)
        {
            throw new InvalidOperationException("Could not load manifest resource stream.");
        }
        using (var reader = new StreamReader(stream))
        {
            return reader.ReadToEnd();
        }
    }
}

Ответ 4

В более новых версиях .Net Core - 2.0 или выше - появился специальный класс EmbeddedFileProvider, который абстрагирует чтение встроенных файлов. Чтобы использовать его, добавьте пакет Microsoft.Extensions.FileProviders.Embedded в свое приложение:

dotnet add package Microsoft.Extensions.FileProviders.Embedded

EmbeddedFileProvider позволяет вам создавать потоковое считывающее устройство и использовать его в соответствии с вашим сценарием:

var embeddedProvider = new EmbeddedFileProvider(Assembly.GetExecutingAssembly());
using (var reader = embeddedProvider.GetFileInfo("yourfile.ext").CreateReadStream())
{
  // some logic with stream reader
}

Ответ 5

Просто создайте подпапку в своем проекте со своими файлами.

В свойствах сделайте ваши файлы "Встроенный ресурс" и "Копировать, если новее". enter image description here

Они будут опубликованы, папки и файлы будут созданы, и вы можете получить к ним доступ следующим образом:

var mySuperScript= File.ReadAllText(System.IO.Directory.GetCurrentDirectory() + @"\folder\MySuperScript.js")