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:
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:
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).
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:
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
Vous devez vous connecter pour publier un commentaire.
Je suppose que la Méthode 1 est d'ajouter les fichiers en double.
C'est du moins la conclusion de l' fil ci-dessus.
Devis:
Vous êtes allé à la page de Ressources de l'propriétés du projet et ajouté les fichiers là, à droite? Vous ensuite dans l'Explorateur de solutions et de changement de l'Action de Construire des fichiers de Ressource Incorporée, droit? C'est pourquoi vous avez été doublement de la taille du fichier: ajouter chaque fichier deux fois.
Il y a deux façons d'ajouter des ressources: les Ressources de la page de propriétés du projet et dans l'Explorateur de solutions. Vous n'avez PAS faire les deux. Si vous souhaitez utiliser GetManifestResourcestream vous n'utilisez PAS la page de Ressources. Vous ajoutez les fichiers du projet dans l'Explorateur de solutions manuellement, vous pouvez alors définir l'Action de Construire Ressource Incorporée.
À l'avenir, faire l'un ou l'autre, pas les deux.
Ajouter un fichier à la page de Ressources de l'propriétés du projet, puis d'y accéder via Mon.Les ressources. Cela va automatiquement ajouter le fichier au projet dans l'Explorateur de solutions, mais de l'Action de Construire sera nul et il doit rester de cette façon.
Ajouter le fichier au projet dans l'Explorateur de solutions en utilisant Ajouter un Nouvel Élément ou Ajouter un Élément Existant. Définir l'Action de génération du fichier de Ressource Incorporée et ensuite accéder à la ressource à l'aide de GetManifestResourceStream.