Comment incorporer et accéder aux ressources à l'aide de Visual C#

Traductions disponibles Traductions disponibles
Numéro d'article: 319292 - Voir les produits auxquels s'applique cet article
Agrandir tout | Réduire tout

Sommaire

Résumé

Cet article étape par étape décrit comment utiliser Visual C# pour incorporer des ressources dans le cadre de l'assembly et ensuite accéder aux ressources au moment de l'exécution.

Vue d'ensemble

Le Framework .NET peut encapsuler des fichiers dans le cadre d'un assembly compilé. Ces fichiers sont connus en tant que ressources incorporées. Ces ressources sont totalement séparés à partir des fichiers .resources et .resx qui sont associés à l'assembly. Vous pouvez accéder à ces ressources au moment de l'exécution par le biais de la classe de l'Assembly de l'espace de noms System.Reflection .

Un avantage majeur de l'incorporation de ressources dans le manifeste est que les fichiers font partie de votre assembly compilé, l'utilisateur ne peut pas accidentellement supprimer ou égarer des fichiers qui sont essentiels à votre application, et qui, dans certains cas, peuvent empêcher l'exécution de votre programme. Une limitation de cette approche est que vous ne pouvez pas enregistrer les modifications à ce fichier à l'assembly sans recompiler le programme. Pour cette raison, comprennent uniquement des fichiers qui ne changeront pas pendant la durée de vie de votre application en tant que ressource incorporée.

Démonstration pas à pas

Pour ajouter des ressources incorporées à votre projet, vous devez d'abord ajouter les fichiers dans le cadre de votre projet. Après avoir ajouté les fichiers à votre projet, vous pouvez accéder et afficher les ressources par le biais de l'espace de noms System.Reflection .

Ajouter des ressources incorporées

Pour ajouter un fichier texte et un fichier image à votre projet comme ressources incorporées, procédez comme suit :
  1. Créez un projet Application Windows pour cette démonstration. Ce formulaire est utilisé pour afficher les ressources qui sont accessibles à partir de l'assembly en cours d'exécution pendant l'exécution.
  2. Le bouton droit sur votre projet, cliquez sur Ajouter, puis cliquez sur Ajouter un nouvel élément.
  3. Dans la boîte de dialogue Nouvel élément , sélectionnez Fichier texte dans le menu et nommez le fichier MyTextFile.txt. Lorsque le fichier s'ouvre dans l'environnement de développement intégré (IDE), ajouter du texte et puis fermez le fichier.
  4. Répétez les étapes 1 et 2 pour ajouter une image bitmap à votre projet, mais au lieu de sélectionner le Fichier texte comme le nouveau type d'élément, sélectionnez Fichier Bitmap, puis renommez le fichier MyImage.bmp. Lorsque la nouvelle image est ouvert dans l'IDE, dessiner quelque chose sur l'image et puis fermez le fichier.
  5. Clic droit sur le fichier texte ou l'image bitmap et sélectionnez Propriétés.
  6. Dans la boîte de dialogue Propriétés , recherchez la propriété Action de génération . Par défaut, cette propriété est définie pour le contenu. Cliquez sur la propriété et modifiez la propriété Action de génération sur Ressource incorporée.
  7. Répétez les étapes 4 et 5 pour l'autre fichier.
La prochaine fois que vous générez le projet, le compilateur ajoute ces fichiers à votre assembly. Le compilateur ajoute l'espace de noms racine du projet au nom de la ressource lorsqu'elle est incluse dans le projet. Par exemple, si l'espace de noms racine de votre projet est MyNamespace, les ressources sont nommés MyNamespace.MyTextFile.txt et MyNamespace.MyImage.bmp.

Remarque: les noms de fichier de ressources respectent la casse. Lorsque vous accéder aux ressources, vous devez utiliser l'orthographe exacte et la casse du nom de fichier. Si vous n'utilisez pas l'orthographe exacte et la casse du nom de fichier, l'appel de méthode pour accéder à la ManifestResourceStream renvoie Nothinget le système ne lève pas d'exception.

Remarque: Si vous souhaitez vérifier les noms de ressource, vous pouvez utiliser Microsoft Intermediate Language Disassembler (ILDASM) pour afficher les données de manifeste qui répertorie les ressources incluses.

Accéder aux ressources

Pour accéder aux ressources que vous avez incorporé dans le manifeste de votre assembly, importez le System.IO et les espaces de noms System.Reflection , comme suit :
   using System.IO;
   using System.Reflection;
				
L'espace de noms System.IO fournit la définition d'un flux et l'espace de noms System.Reflection définit la classe Assembly qui fournit des méthodes pour accéder aux ressources qui sont incorporés dans votre assembly.

Lorsque vous déclarez les éléments suivants dans la zone des déclarations générales, les ressources de l'assembly sont lus lorsque le formulaire est chargé :
   Assembly _assembly;
   Stream _imageStream;
   StreamReader _textStreamReader;
				
Remarque: pour accéder à l'événement Load du formulaire dans l'éditeur de Code, double-cliquez sur le formulaire dans l'éditeur de conception.

Pour lire la ressource de l'assembly qui exécute le code en cours, vous devez obtenir une instance de cet assembly. Pour ce faire, utilisez la méthode GetExecutingAssembly de l'assembly, comme suit :
   _assembly = Assembly.GetExecutingAssembly();
				
La lecture des informations de la ressource depuis un flux de données est effectuée avec un appel de méthode GetManifestResourceStream. Le paramètre passé à cette méthode est le nom de la ressource qui doit être atteinte. Les deux ressources sont ensuite lus à leurs flux de données correspondante lorsque l'événement Load du formulaire est exécuté.
   _imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp");
   _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));
				
Le code dans l'événement Load du formulaire semblable au suivant :
   try
   {
      _assembly = Assembly.GetExecutingAssembly();
      _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
      _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
   }
   catch
   {
      MessageBox.Show("Error accessing resources!");
   }
				
L'instruction Try-Catch , connue comme la Gestion des erreurs structurée dans .NET, est utilisée pour détecter les erreurs qui se sont produites lors de l'instance de la classe Assembly accède aux ressources.

Afficher les ressources

Cet exemple utilise deux boutons pour afficher les ressources incorporées. Lorsque vous cliquez sur le premier bouton, une image bitmap qui est basée sur la ressource qui est lu à partir de l'assembly est créée et affichée dans le contrôle PictureBox du formulaire. Le deuxième bouton lit à partir d'une ressource de texte et affiche le texte dans une zone de texte.

Pour afficher les ressources incorporées, procédez comme suit :
  1. Ajoutez un contrôle PictureBox au formulaire.
  2. Ajouter un nouveau contrôle de bouton au formulaire et puis modifiez sa propriété Text pour Afficher l'Image.
  3. Double-cliquez sur le bouton pour ouvrir son événement Click dans la visionneuse de code et puis collez le code suivant dans ce cas :
       try
       {
          pictureBox1.Image = new Bitmap(_imageStream);			       }
       catch 
       {
          MessageBox.Show("Error creating image!");
       }
    					
    Ce code génère une nouvelle instance d'une bitmap qui est basée sur le flux de ressources qui a été lu dans l'événement Load du formulaire.

  4. Ajoutez un contrôle TextBox au formulaire.
  5. Ajoutez un autre contrôle de bouton au formulaire et puis modifiez sa propriété Text pour Obtenir le texte.
  6. Double-cliquez sur le bouton pour ouvrir la Click_Event pour le bouton dans l'éditeur de conception et puis collez le code suivant dans l'événement :
       try
       {
          if(_textStreamReader.Peek() != -1)
          {
             textBox1.Text = _textStreamReader.ReadLine();
          }
       }
       catch
       {
          MessageBox.Show("Error writing text!");
       }
    					
    Ce code détermine si les caractères à lire existent toujours dans le flux. Si des caractères sont trouvés, une ligne est en lecture à la zone de texte.

  7. Appuyez sur F5 pour exécuter l'application.

Code complet

   using System;
   using System.Drawing;
   using System.Collections;
   using System.ComponentModel;
   using System.Windows.Forms;
   using System.Data;

   using System.IO;
   using System.Reflection;

   namespace MyNamespace
   {
      /// <summary>
      /// Summary description for Form1.
      /// </summary>
      public class Form1 : System.Windows.Forms.Form
      {
         private System.Windows.Forms.PictureBox pictureBox1;
         private System.Windows.Forms.TextBox textBox1;
         private System.Windows.Forms.Button button1;
         private System.Windows.Forms.Button button2;
         /// <summary>
         /// Required designer variable.
         /// </summary>
         private System.ComponentModel.Container components = null;

         public Form1()
         {
            // 
            // Required for Windows Form Designer support.
            // 
            InitializeComponent();

            // 
            // TODO: Add any constructor code after InitializeComponent call.
            // 
         }

         /// <summary>
         /// Clean up any resources being used.
         /// </summary>
         protected override void Dispose( bool disposing )
         {
            if( disposing )
            {
               if (components != null) 
               {
                  components.Dispose();
               }
            }
            base.Dispose( disposing );
         }

      #region Windows Form Designer generated code
         /// <summary>
         /// Required method for Designer support - do not modify
         /// the contents of this method with the code editor.
         /// </summary>
         private void InitializeComponent()
         {
            this.pictureBox1 = new System.Windows.Forms.PictureBox();
            this.textBox1 = new System.Windows.Forms.TextBox();
            this.button1 = new System.Windows.Forms.Button();
            this.button2 = new System.Windows.Forms.Button();
            this.SuspendLayout();
            // 
            // pictureBox1
            // 
            this.pictureBox1.Location = new System.Drawing.Point(4, 8);
            this.pictureBox1.Name = "pictureBox1";
            this.pictureBox1.Size = new System.Drawing.Size(284, 192);
            this.pictureBox1.TabIndex = 0;
            this.pictureBox1.TabStop = false;
            // 
            // textBox1
            // 
            this.textBox1.Location = new System.Drawing.Point(92, 236);
            this.textBox1.Name = "textBox1";
            this.textBox1.Size = new System.Drawing.Size(192, 20);
            this.textBox1.TabIndex = 1;
            this.textBox1.Text = "textBox1";
            // 
            // button1
            // 
            this.button1.Location = new System.Drawing.Point(8, 208);
            this.button1.Name = "button1";
            this.button1.TabIndex = 2;
            this.button1.Text = "Show Image";
            this.button1.Click += new System.EventHandler(this.button1_Click);
            // 
            // button2
            // 
            this.button2.Location = new System.Drawing.Point(8, 236);
            this.button2.Name = "button2";
            this.button2.TabIndex = 3;
            this.button2.Text = "Get Text";
            this.button2.Click += new System.EventHandler(this.button2_Click);
            // 
            // Form1
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.AddRange(new System.Windows.Forms.Control[]{
                                                                     this.button2,
                                                                     this.button1,
                                                                     this.textBox1,
                                                                     this.pictureBox1});

            this.Name = "Form1";
            this.Text = "Form1";
            this.Load += new System.EventHandler(this.Form1_Load);
            this.ResumeLayout(false);
         }
      #endregion

         Assembly _assembly;
         Stream _imageStream;
         StreamReader _textStreamReader;

         /// <summary>
         /// The main entry point for the application.
         /// </summary>
         [STAThread]
         static void Main() 
         {
            Application.Run(new Form1());
         }

         private void Form1_Load(object sender, System.EventArgs e)
         {
            try
            {
               _assembly = Assembly.GetExecutingAssembly();
               _imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
              _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
            }
            catch
            {
               MessageBox.Show("Error accessing resources!");
            }		
         }

         private void button1_Click(object sender, System.EventArgs e)
         {
            try
            {
               pictureBox1.Image = new Bitmap(_imageStream);
            }
            catch 
            {
               MessageBox.Show("Error creating image!");
            }
         }

         private void button2_Click(object sender, System.EventArgs e)
         {
            try
            {
               if(_textStreamReader.Peek() != -1)
               {
                  textBox1.Text = _textStreamReader.ReadLine();
               }
            }
            catch
            {
               MessageBox.Show("Error writing text!");
            }		
         }
      }
   }
				
Remarque : Le code doit être modifié dans Visual Studio 2005 ou Visual Studio 2008. Lorsque vous créez un projet Windows Forms, Visual C# ajoute un formulaire au projet par défaut. Ce formulaire est nommé Form1. Les deux fichiers qui représentent le formulaire sont nommés Form1.cs et Form1.designer.cs. Vous écrivez votre code dans Form1.cs. Le fichier Designer.cs est où le Concepteur Windows Forms écrit le code qui implémente toutes les actions que vous avez effectuées en ajoutant des contrôles. Pour plus d'informations sur le Concepteur Windows Forms dans Visual C# 2005 ou dans Visual Studio 2008, reportez-vous au site Web de Microsoft à l'adresse suivante :
http://msdn2.Microsoft.com/en-us/library/ms173077.aspx

Résolution des problèmes

Étant donné que les noms de ressources respectent la casse, vérifiez que vous utilisez le mot correctement orthographié et le cas des ressources qui sont accessibles. Vous pouvez utiliser ILDASM pour lire les données pour vérifier l'orthographe exacte des ressources de manifeste.

Références

Pour plus d'informations, consultez les sites Web de Microsoft Developer Network (MSDN) suivant :
Espace de noms System.Reflection
http://msdn2.Microsoft.com/en-us/library/System.Reflection (vs.71) .aspx

Classe assembly
http://msdn2.Microsoft.com/en-us/library/System.Reflection.assembly (vs.71) .aspx

Assembly.GetManifestResourceStream, méthode
http://msdn2.Microsoft.com/en-us/library/System.Reflection.assembly.GetManifestResourceStream (vs.71) .aspx

Propriétés

Numéro d'article: 319292 - Dernière mise à jour: dimanche 7 avril 2013 - Version: 5.0
Les informations contenues dans cet article s'appliquent au(x) produit(s) suivant(s):
  • Microsoft Visual C# .NET 2002 Initiation
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
Mots-clés : 
kbsweptvs2008 kbhowtomaster kbmt KB319292 KbMtfr
Traduction automatique
IMPORTANT : Cet article est issu du système de traduction automatique mis au point par Microsoft (http://support.microsoft.com/gp/mtdetails). Un certain nombre d?articles obtenus par traduction automatique sont en effet mis à votre disposition en complément des articles traduits en langue française par des traducteurs professionnels. Cela vous permet d?avoir accès, dans votre propre langue, à l?ensemble des articles de la base de connaissances rédigés originellement en langue anglaise. Les articles traduits automatiquement ne sont pas toujours parfaits et peuvent comporter des erreurs de vocabulaire, de syntaxe ou de grammaire (probablement semblables aux erreurs que ferait une personne étrangère s?exprimant dans votre langue !). Néanmoins, mis à part ces imperfections, ces articles devraient suffire à vous orienter et à vous aider à résoudre votre problème. Microsoft s?efforce aussi continuellement de faire évoluer son système de traduction automatique.
La version anglaise de cet article est la suivante: 319292
L'INFORMATION CONTENUE DANS CE DOCUMENT EST FOURNIE PAR MICROSOFT SANS GARANTIE D'AUCUNE SORTE, EXPLICITE OU IMPLICITE. L'UTILISATEUR ASSUME LE RISQUE DE L'UTILISATION DU CONTENU DE CE DOCUMENT. CE DOCUMENT NE PEUT ETRE REVENDU OU CEDE EN ECHANGE D'UN QUELCONQUE PROFIT.

Envoyer des commentaires

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com