Comment utiliser les ressources embarquées en
C# ?
Ce guide étape par étape montre comment utiliser C# pour intégrer une ressource dans le cadre d'un assembly, puis accéder à la ressource au moment de l'exécution.
Le .NET Framework peut encapsuler des fichiers dans le cadre d'un assembly compilé. Ces fichiers sont appelés ressources intégrées. Ces ressources sont des assemblys complètement distincts associés aux fichiers .resource et .resx. Vous pouvez accéder à ces ressources au moment de l'exécution via la classe Assembly dans l'espace de noms System.Reflection .
Le principal avantage des ressources manifestes intégrées est que, comme ces fichiers font partie de l'assembly compilé, les utilisateurs ne peuvent pas supprimer accidentellement ou les insérer par erreur dans votre application, ce qui dans certains cas. des fichiers vitaux peuvent empêcher l’exécution du programme. L'une des limites de cette approche est que vous ne pouvez enregistrer aucune modification apportée à l'assembly de ce fichier sans recompiler le programme. Pour cette raison, n'incluez que les fichiers qui ne changeront pas pendant la durée de vie de l'application en tant que ressources intégrées.
Pour ajouter des ressources intégrées à votre projet, vous devez d'abord ajouter ces fichiers dans le cadre de votre projet. Après avoir ajouté des fichiers à votre projet, vous pouvez accéder et afficher les ressources dans l'espace de noms System.Reflection.
Pour ajouter des fichiers texte et des fichiers image à intégrer en tant que ressources dans votre projet, suivez ces étapes :
Créez un nouveau projet d'application Windows pour cette démo. Ce formulaire est utilisé pour afficher les ressources accessibles au moment de l'exécution à partir d'un assembly en cours d'exécution.
Cliquez avec le bouton droit sur le nom du projet, cliquez sur Ajouter, puis cliquez sur Ajouter un nouvel élément
Dans la boîte de dialogue Nouveau projet, dans le menu, sélectionnez Fichier texte et nommez le fichier MonTexteFichier.txt. Ouvrez le fichier dans l'environnement de développement intégré (IDE), ajoutez du texte, puis fermez le fichier.
Répétez les étapes 1 et 2 pour ajouter l'image bitmap au projet, mais au lieu de sélectionner Fichier texte comme nouveau type de projet, sélectionnez Fichier bitmap puis changez le nom du fichier en MyImage.bmp. Lorsque vous ouvrez une nouvelle image dans l'EDI, le contenu est dessiné sur l'image, puis le fichier est fermé.
Cliquez avec le bouton droit sur le texte ou le bitmap du fichier et sélectionnez Propriétés
Dans le Propriétés, recherchez la propriété Build Action. Par défaut, cette propriété est définie sur content. Cliquez sur la propriété et remplacez la propriété Build Action par Embedded Resource
Répétez les étapes 4 et 5 pour l'autre fichier.
La prochaine fois que vous construirez votre projet, le compilateur ajoutera ces fichiers à votre assembly. Nom de la ressource à laquelle le compilateur ajoute l'espace de noms racine du projet lorsqu'elle est incluse dans un projet. Par exemple, si l'espace de noms racine de votre projet est MyNamespace, les ressources sont nommées MyNamespace.MyTextFile.txt et MyNamespace.MyImage.bmp.
Veuillez noter : les noms des fichiers de ressources sont sensibles à la casse. Lorsque vous accédez à une ressource, vous devez utiliser l'orthographe et la casse exactes du nom du fichier. Si vous n'utilisez pas l'orthographe et la casse exactes du nom de fichier, l'appel de méthode pour accéder à ManifestResourceStream renvoie n'effectue aucune action et le système ne déclenche pas anormal.
Remarque : Si vous souhaitez vérifier ces noms de ressources, vous pouvez utiliser le Microsoft Intermediate Language Disassembler (ILDASM) pour afficher les données du manifeste, qui répertorie les ressources incluses.
Pour accéder aux ressources qui ont été intégrées dans le manifeste de votre assembly, importez System.IO et System.Reflection espace de noms, comme suit :
L'espace de nomsusing System.IO; using System.Reflection;
System.IO fournit des définitions de flux et de méthodes de classes fournies par les assemblys définis dans l'espace de noms System.Reflection, pour accéder ressources intégrées dans l’assembly.
Lire les ressources de l'assembly lorsque le formulaire est chargé lorsqu'il est déclaré dans la zone de déclaration générale suivante :
Assembly _assembly; Stream _imageStream; StreamReader _textStreamReader;
Remarque : Pour accéder au Pour le Chargez l' événement du formulaire dans l'Éditeur de code, veuillez double-cliquer sur le formulaire dans l'Éditeur de conception.
Pour lire les ressources d'un assembly où le code actuel s'exécute, vous devez obtenir une instance de cet assembly. Pour ce faire, utilisez la méthode GetExecutingAssembly de l'assembly, comme suit :
_assembly = Assembly.GetExecutingAssembly();
Pour lire les informations d'une ressource dans un flux, utilisez GetManifestResourceStream L'appel de méthode est exécuté. Le paramètre passé à cette méthode est le nom de la ressource à laquelle accéder. Exécutez l'événement Load du formulaire, puis lisez les deux ressources dans leurs flux correspondants.
_imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp"); _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));
Le code dans l'événement Load du formulaire est le 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!"); }
Instruction Try-catch, appelée In .NET, la gestion structuréedes erreurs est utilisée pour capturer toutes les erreurs qui peuvent survenir lorsqu'une instance d'une classe assembly accède à une ressource.
Cet exemple utilise deux boutons pour afficher les ressources intégrées. Lorsque vous cliquez sur le premier bouton, une image bitmap basée sur la ressource lue à partir de l'assemblage est créée et affichée dans la zone ImageContrôle du formulaire. La ressource texte du deuxième bouton est lue et le texte affiché dans la zone de texte.
Pour afficher une ressource intégrée, suivez ces étapes :
Ajoutez un contrôle Picture Box au formulaire.
Ajoutez un nouveau contrôle Button au formulaire, puis modifiez sa propriété Text en Display Image
Double-cliquez sur le bouton pour ouvrir son événement Click dans la visionneuse de code, puis collez dans ce cas le code suivant :
try { pictureBox1.Image = new Bitmap(_imageStream); } catch { MessageBox.Show("Error creating image!"); }
Ce code génère une nouvelle instance basée sur le bitmap du flux de ressources lu dans l'événement Load du formulaire.
Ajoutez un contrôle TextBox au formulaire.
Ajoutez un autre contrôle Button au formulaire, puis modifiez sa propriété Text en Get Text
Double-cliquez sur le bouton dans l'éditeur de conception pour ouvrir le Click_Event, 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 le caractère à lire est toujours présent dans le flux. Si le caractère est trouvé, la zone de texte lira la ligne.
Appuyez sur F5 pour exécuter l'application.
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!"); } } } }
REMARQUESi vous êtes dans Visual Studio 2005 ou dans Visual Studio 2008, vous devez modifier le code. 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 représentant le formulaire s'appellent Form1.cs et Form1.designer.cs. Écrivez votre code dans Form1.cs. Le fichier Designer.cs est le code écrit par le Concepteur Windows Forms qui implémente toutes les actions que vous effectuez en ajoutant des contrôles. Pour plus d'informations sur Windows Forms Designer dans Visual C# 2005 ou Visual Studio 2008, visitez Microsoft ci-dessous Site Web :
http://msdn2.microsoft.com/en-us/library/ms173077.aspx
En raison de Les noms des ressources sont sensibles à la casse. Veuillez vérifier que vous accédez à la ressource en utilisant l'orthographe et la casse appropriées. Vous pouvez utiliser ILDASM pour lire les données du manifeste afin de vérifier l'orthographe exacte d'une ressource.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!