web-dev-qa-db-fra.com

Ressource incorporée dans les bibliothèques .Net Core

J'ai juste commencé à regarder dans .Net Core, et je ne vois pas de ressources classiques ni de ressources qui ressemblent à des ressources. Dans les bibliothèques de classes .Net classiques, j’ai pu ajouter, par exemple, des fichiers texte avec un script à mon projet, puis ajouter ces fichiers aux ressources du projet. Après cela, je pourrais facilement l'utiliser de la manière suivante:

Connection.Execure(Properties.Resources.MySuperScript);

Je constate qu’il n’ya pas cette fonctionnalité dans les bibliothèques .Net Core, du moins je ne la vois pas. Existe-t-il une alternative dans .Net Core pour stocker des données statiques en tant que ressource incorporée dans des bibliothèques? Et comment l'utiliser s'il existe?

48
Don Tomato

UPDATE:

.NET Core 1.1 et versions ultérieures ont abandonné project.json et retourné à .csproj des dossiers. Cela change l'étape 2, mais pas tellement. Les lignes nécessaires sont très similaires:

<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>

Il peut y avoir un semblable *.tff forme; non confirmé.

Les étapes 1 et 3 sont inchangées.


Pour utiliser les ressources incorporées dans le projet .NET Core 1.0, procédez comme suit:

1.- Ajoutez vos fichiers incorporés comme d’habitude.

Exemple: certains fichiers FONT sur un répertoire nommé "_fonts"

enter image description here

2.- Modifier "project.json" pour inclure les ressources associées.

Dans mon cas:

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

3.- Accéder à la ressource incorporée en code.

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

Le point clé est d'utiliser le bon nom lors de l'appel "GetManifestResourceStream". Vous devez utiliser [nom de l’assemblage]. [Répertoire]. [Nom du fichier].

J'espère que ça aide quelqu'un là-bas ^ _ ^.

72
Nacho Coll

Maintenant que project.json est obsolète, vous devez le spécifier dans le .csproj fichier.

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

Vous pouvez utiliser un caractère générique, ou simplement lister explicitement les fichiers.

47
Drew Noakes

Généralement, les gens ont déjà répondu à cette question, il s'agit donc d'un rendu des réponses en quelque chose de simple.

Avant d’utiliser ce qui suit, le fichier doit être ajouté en tant que ressource incorporée à . Csproj / project.json

tilisation

var myJsonFile = ReadManifestData<Tests>("myJsonFile.json");
  1. Paramètre: nom de fichier incorporé; Type: n'importe quelle classe de l'assembly de la ressource cible
  2. cherche une ressource incorporée avec ce nom
  3. renvoie la valeur de la chaîne

Méthode

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
Dann

Créez simplement un sous-dossier dans votre projet avec vos fichiers.

Dans les propriétés, créez vos fichiers "Ressources incorporées" et "Copier si plus récent". enter image description here

Ils seront publiés, des dossiers et des fichiers seront créés, et vous pouvez y accéder comme suit:

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

Avec les versions plus récentes de .Net Core - 2.0 ou version ultérieure, il existe une classe spécialisée EmbeddedFileProvider qui résume la lecture du fichier incorporé. Pour l'utiliser, ajoutez Microsoft.Extensions.FileProviders.Embedded package pour votre application:

dotnet add package Microsoft.Extensions.FileProviders.Embedded

Le EmbeddedFileProvider vous permet de créer un lecteur de flux et de l'utiliser selon votre scénario:

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