Ceci est une application C # .NET 4.0:
J'intègre un fichier texte en tant que ressource, puis j'essaie de l'afficher dans une boîte de dialogue:
var assembly = Assembly.GetExecutingAssembly();
var resourceName = "MyProj.Help.txt";
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
{
using (StreamReader reader = new StreamReader(stream))
{
string result = reader.ReadToEnd();
System.Windows.Forms.MessageBox.Show(result, "MyProj", MessageBoxButtons.OK);
}
}
La solution est MyProjSolution et l'exécutable est MyProj.exe. Help.txt est une ressource intégrée. Cependant, le flux est nul. J'ai essayé MyProjSolution.Help.txt et MyProjSolution.MyProj.Help.txt mais rien ne semble fonctionner.
Réponses:
Vous pouvez vérifier que les ressources sont correctement incorporées en utilisant
lors du débogage. Cela listera toutes les (noms complets) de toutes les ressources incorporées dans l'assembly dans lequel votre code est écrit.
Voir Assembly.GetManifestResourceNames () sur MSDN.
Copiez simplement le nom pertinent et utilisez-le à la place de ce que vous avez défini dans la variable 'resourceName'.
Remarques - le nom de la ressource est sensible à la casse, et si vous avez incorrectement incorporé le fichier de ressources, il n'apparaîtra pas dans la liste renvoyée par l'appel à GetManifestResourceNames (). Assurez-vous également que vous lisez la ressource à partir de l'assembly approprié (si plusieurs assemblys sont utilisés) - il est trop facile d'obtenir les ressources de l'assembly en cours d'exécution plutôt que d'un assembly référencé.
EDIT - .NET Core
Veuillez consulter ce post SO pour plus de détails sur la façon d'intégrer à l'aide de .NET Core.
La récupération des informations du manifeste semble similaire - utilisez simplement
this.GetType().GetTypeInfo().Assembly.GetManifestResourceNames()
pour obtenir le manifeste a de l'assembly où le code est en cours d'exécution.Je n'ai pas encore trouvé comment faire l'équivalent de
Assembly.GetExecutingAssembly()
.NET Core! si quelqu'un sait - s'il vous plaît laissez-moi savoir et je mettrai à jour cette réponse.la source
J'ai eu un problème similaire, vérifiez d'abord que le fichier est inclus dans votre projet, puis accédez aux propriétés et définissez l'action de construction de ce fichier sur Ressource intégrée. cela a fonctionné pour moi.
la source
DefatultNameSpace.Infrastructure.Help.txt
. L'espace de noms par défaut dans la page de propriétés de votre projet etInfrastructure
serait le dossier dansLa propriété "Build Action" du fichier incorporé doit être définie sur "Embedded Resource" pour exécuter correctement la ligne indiquée ci-dessous:
Faites un clic droit sur le fichier, cliquez sur la propriété, puis définissez la propriété "Action de construction" sur "Ressource intégrée":
la source
Voici la cause de ma valeur nulle.
http://adrianmejia.com/blog/2011/07/18/cs-getmanifestresourcestream-gotcha/
La
GetManifestResourceStream
méthode retournera toujoursNULL
si la propriété 'action construite' de la ressource n'est pas définie sur 'ressource intégrée'Après avoir défini cette propriété avec tous les fichiers nécessaires,
assembly.GetManifestResourceStream
commencez à renvoyer le flux correct au lieu deNULL
.la source
Juste un avertissement.
Je ne pouvais pas accéder à mon fichier en tant que ressource intégrée même si j'avais spécifié que c'était le cas et même s'il avait cette propriété Build Action. J'ai perdu beaucoup de temps à me cogner la tête. J'ai intégré un fichier de code csharp avec .txt ajouté à son nom (xxx.cs.txt). Pour une raison quelconque, les méthodes GetManifestResourceNames () et GetManifestResourceStream () ne verront pas un fichier avec .cs dans son nom.
Je l'ai renommé simplement xxx.txt et tout allait bien.
Bizarre.
la source
Resource
mais pasEmbedded Resource
, ce qui le rend encore plus étrange ... Le retrait.cs.
du nom le fait fonctionner. Argh.J'ai eu le même problème, grâce à Jay, j'ai trouvé que c'était des traits d'union dans le nom du répertoire.
ProjectName.ResourceFolder.Sub-Directory
devientProjectName.ResourceFolder.Sub_Directory
lorsque vous référencez le flux de ressources.la source
Dans mon cas, le problème était que le code recherchant la ressource était dans un projet différent de celui de la ressource elle-même.
Vous ne pouvez accéder qu'aux ressources qui se trouvent dans le même projet que le code. Je pensais pouvoir mettre toutes mes ressources dans le projet de page Web, mais j'ai également besoin d'images dans le projet de messagerie.
J'espère que cela aide quelqu'un dans la même situation que moi.
Je trouve l'appel vraiment utile
Assembly.GetExecutingAssembly().GetManifestResourceNames();
.la source
Au cas où cela aiderait quelqu'un d'autre, assurez-vous que la
Assembly.GetExecutingAssembly()
ligne est appelée à partir du même assembly qui a des ressources incorporées.la source
Une solution simple et rationalisée consiste à avoir cette classe de base :
Ensuite, lorsque vous ajoutez une ressource, vous créez une classe de lecteur C # dans le même dossier:
où la classe de lecture MyResource.cs est très simple:
Ainsi, chaque ressource aura une classe "shadow" qui sait la lire correctement.
Voici comment vous lisez la ressource dans votre code:
Et comme d'autres réponses le suggèrent, n'oubliez pas de définir "Ressource intégrée" dans la propriété Action de construction du fichier de ressources.
L'avantage de cette solution uniforme est
la source
la source
Vous devez décharger votre solution, puis éditer le projet, après avoir trouvé votre dossier et changer comme ceci:
la source
Bien que OP ait obtenu GetManifestResourceStream renvoyant NULL à partir des ressources du même assembly, certaines réponses suggéraient que lorsque les ressources se trouvaient dans un autre projet ou assembly, elles ne pouvaient pas être récupérées et étaient une cause équitable de GetManifestResourceStream retournant NULL.
Ce n'est pas vrai, du moins depuis 2011; comme je l'ai souligné dans certains commentaires ailleurs, Assembly.LoadFrom () ou typeof font l'affaire et par conséquent, vous pouvez accéder aux ressources qui se trouvent dans un autre projet.
J'ai ici un exemple modérément complexe pour illustrer; voici ma configuration de test:
Chemin vers un autre projet:
Capturé ici:
Et sur Form1.cs de WinFormFramework, je spécifie avec
comme ça:
Et le résultat affiché dans la zone de texte:
J'ai passé plusieurs heures à bien faire les choses; pour cela, j'ai dû utiliser beaucoup ceux-ci chez Immediate Window:
J'espère que ça aide quelqu'un
la source
Vous devez probablement spécifier le chemin de votre fichier txt dans le
GetManifestResourceStream
paramètre, ou vous pouvez essayer de coller le fichier txt dans le même répertoire que votre exécutable. J'espère que cela pourra aider!la source