Comment faire pour 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 explique comment utiliser Visual C# pour incorporer des ressources dans le cadre de l'assembly, puis accéder aux ressources au moment de l'exécution.

Vue d'ensemble

Le.NET Framework peuvent 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 du manifeste est que dans la mesure où les fichiers font partie de votre assembly compilé, l'utilisateur ne peut pas accidentellement supprimer ou égaré des fichiers qui sont cruciales pour votre application, ce qui, dans certains cas, peut-être empêcher l'exécution de votre programme. Une limitation de cette approche est que vous ne peut pas enregistrer les modifications à ce fichier à l'assembly sans recompiler le programme. De ce fait, incluent uniquement les fichiers qui ne changent pas pendant la durée de vie de votre application comme une 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. Une fois que vous avez 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 en tant que ressources incorporées, procédez comme suit :
  1. Créez un nouveau projet d'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 au moment de l'exécution.
  2. Le bouton droit sur votre projet et 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, 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 un Fichier texte en tant que 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, quelque chose de dessiner sur l'image et puis fermez le fichier.
  5. Clic droit sur le fichier texte ou l'image bitmap et puis cliquez sur Propriétés.
  6. Dans la boîte de dialogue Propriétés , recherchez la propriété Build Action . 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 fichiers de ressources sont sensibles à 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 la 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 des ressources, 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 de données et l'espace de noms System.Reflection définit la classe de l'Assembly qui fournit des méthodes pour accéder aux ressources qui sont incorporées 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 dans 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();
				
Lecture des informations de la ressource à un flux de données est exécutée avec un appel de méthode GetManifestResourceStream. Le paramètre passé à cette méthode est le nom de la ressource est accessible. Les deux ressources sont ensuite lus à leurs flux de données correspondant lors de l'exécution de l'événement Load du formulaire.
   _imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp");
   _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));
				
Le code dans l'événement Load du formulaire ressemble à la suivante :
   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 structurée des erreurs dans .NET, est utilisée pour détecter les erreurs qui se sont produites pendant que 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 de l'écran. 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 vers le formulaire et ensuite modifier 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 collez le code suivant dans cet événement :
       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 Button au formulaire et modifiez sa propriété Text pour Obtenir le texte.
  6. Double-cliquez sur le bouton dans l'éditeur de conception pour ouvrir le Click_Event pour le bouton et 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 lue depuis 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 dans 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 de Visual C# 2005 ou Visual Studio 2008, visitez le 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 l'orthographe et la casse des ressources qui sont accessibles. Vous pouvez utiliser l'outil ILDASM pour lire les données de manifeste pour vérifier l'orthographe exacte des ressources.

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

Assembly (classe)
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: lundi 28 juillet 2014 - Version: 6.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 d'une traduction automatique réalisée par un logiciel Microsoft et non par un traducteur professionnel. Cette traduction automatique a pu aussi être révisée par la communauté Microsoft grâce à la technologie Community Translation Framework (CTF). Pour en savoir plus sur cette technologie, veuillez consulter la page http://support.microsoft.com/gp/machine-translation-corrections/fr. Microsoft vous propose en effet des articles traduits par des professionnels, des articles issus de traductions automatiques et des articles issus de traductions automatiques révisées par la communauté Microsoft, de manière à ce que vous ayez accès à tous les articles de notre Base de connaissances dans votre langue. Il est important de noter que les articles issus de la traduction automatique, y compris ceux révisés par la communauté Microsoft, peuvent contenir des erreurs de vocabulaire, de syntaxe ou de grammaire. Microsoft ne pourra être tenu responsable des imprécisions, erreurs, ainsi que de tout dommage résultant d?une traduction incorrecte du contenu ou de son utilisation par les clients.
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