Découvrir la confusion à propos des ressources intégrées

EDIT: Lire la réponse numéro 1 de Tim Schmelter, puis utiliser cette question pour des exemples de la façon d'intégrer des ressources et de l'accès lors de l'exécution.

L'objet de ressources intégrées revient beaucoup, surtout avec les gens demandent comment accéder aux fichiers incorporés au moment de l'exécution. Les choses deviennent plus de confusion, car Visual Studio vous offre 2 façons différentes de l'intégration d'une ressource, et les différentes façons d'accéder à ces ressources lors de l'exécution. Le problème est que selon la méthode utilisée pour intégrer les ressources, la méthode que vous essayez de l'utiliser pour accéder au fichier lors de l'exécution peut ne pas fonctionner. Ce post est une tentative de dissiper la confusion que je vois là-bas, mais j'ai aussi une question que personne ne semble répondre des faits: Pourquoi est la taille de mon programme compilé deux fois la taille de la ressource incorporée (parfois)? Par exemple, si je intégrer un fichier de 20 mo dans mon projet, pourquoi mon programme compile à 40 MO? J'ai nantis posé cette question dans le passé et personne n'a été en mesure de reproduire les résultats de ma recherche. J'ai trouvé que la raison pour laquelle ils n'ont pas été en mesure de reproduire est parce qu'ils étaient intégrer le fichier dans un autre. Voir ici:

Méthode 1:

Double-cliquez sur Mon Projet d'ouvrir les pages de propriétés et allez à l'Onglet Ressources. Maintenant, cliquez sur Ajouter une Ressource > Ajouter un Fichier Existant. Recherchez le fichier que vous souhaitez intégrer. Pour cet exemple, je suis en utilisant un fichier exécutable. Maintenant, vous pouvez voir votre fichier sur l'Onglet Ressources:

Découvrir la confusion à propos des ressources intégrées

Vous verrez également qu'un dossier nommé Ressources a été créé en vertu de votre projet et le fichier incorporé a été placé dans ce dossier:

Découvrir la confusion à propos des ressources intégrées

EDIT: LA PROCHAINE ÉTAPE ÉTAIT LE PROBLÈME. S'AVÈRE QUE LORSQUE VOUS AJOUTEZ UN FICHIER VIA L'ONGLET "RESSOURCES", VOUS DEVRIEZ PAS ENSEMBLE DE L'ACTION DE CONSTRUIRE RESSOURCE INCORPORÉE. Contre-intuitive pour dire le moins!

Maintenant avec le fichier sélectionné, regarder vers le bas dans la fenêtre de propriétés du fichier et modifier l'action de construire Ressource Incorporée: (cette étape doit être effectuée UNIQUEMENT lorsque vous ajoutez un fichier via la méthode 2).

Découvrir la confusion à propos des ressources intégrées

Maintenant compiler votre programme. Vous verrez que la taille de votre programme compilé est au moins le double de la taille de votre ressource incorporée. Cela ne se produit pas avec la méthode 2. Voir ici:

Méthode 2:

Cliquez-droit sur le nom de votre projet et sélectionnez Ajouter > un Élément Existant. Naviguez jusqu'à votre fichier, et cette fois, vous remarquerez que même si c'était en effet placé sous votre projet, il n'y a pas de dossier de Ressources de création:

Découvrir la confusion à propos des ressources intégrées

Maintenant, encore une fois, sélectionnez le fichier et modifier le Build Action Intégré des Ressources et de les compiler. Cette fois, la taille de la compilation du programme sera comme vous l'avez prévu, à propos de la taille du fichier incorporé et pas le double de la taille comme avec la méthode 1.

La méthode que vous utilisez pour intégrer votre fichier de déterminer la méthode que vous pouvez utiliser pour accéder au fichier lors de l'exécution. Pour la méthode 1 c'est très simple, tout ce que vous avez à faire est de:

My.Computer.FileSystem.WriteAllBytes(Path, My.Resources.ResourceName, Append)

Où Path est l'emplacement et le nom du fichier que vous souhaitez enregistrer sur le disque dur, ResourceName est le nom de la ressource incorporée que vous voyez dans la fenêtre de projet (sans extension), et l'Ajout est de savoir si ou non vous voulez créer un nouveau fichier ou d'écraser un fichier existant. Ainsi, par exemple, à l'aide de test.exe à partir de l'image ci-dessus, j'ai pu enregistrer ce fichier sur le disque C comme ceci:

My.Computer.FileSystem.WriteAllBytes(“C:\test.exe”, My.Resources.test, False)

Ne pouvait pas être plus facile.

Méthode 2 cependant ne semble pas vous donner accès à Mon.Ressources de sorte qu'il devient un peu plus compliqué. Vous devez créer un Flux de tenir la ressource, mettre le filet dans un tableau d'octets, puis écrire les octets dans le fichier système. La façon la plus simple que j'ai trouvé à faire c'est comme cela:

Using s As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(Project.ResourceName)
Dim bytes(s.Length) As Byte
s.Read(bytes, 0, bytes.Length)
File.WriteAllBytes(OutputFile, bytes)
End Using

Avec cette méthode ResourceName doit contenir l'extension du fichier ET le nom du projet ainsi à l'aide de notre exemple ci-dessus, nous pouvons juste faire:

Using s As Stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(WindowsApplication1.test.exe)
Dim bytes(s.Length) As Byte
s.Read(bytes, 0, bytes.Length)
File.WriteAllBytes(“C:\test.exe”, bytes)
End Using

Les fichiers texte sont un peu différentes:

Dim output As String
Using sr As StreamReader = New StreamReader(Assembly.GetExecutingAssembly().GetManifestResourceStream(WindowsApplication1.test.txt))
output = sr.ReadToEnd()
End Using

Using sw As StreamWriter = New StreamWriter(“C:\test.txt”)
sw.Write(output)
End Using

Avoir lutté avec le présent dans le passé, j'espère que cela aidera quelqu'un. Et si vous pensez que vous pouvez expliquer les faits pourquoi la méthode 1 de l'incorporation d'une ressource gonfle mon programme compilé pour le double de sa taille, je voudrais vraiment l'apprécier.

source d'informationauteur Escobar Ceaser | 2012-01-13