Встроенный ресурс в .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");
- Параметр: имя встроенного имени файла; Тип: любой класс из целевой сборки ресурсов
- ищет встроенный ресурс с этим именем
- возвращает строковое значение
метод
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")