Come incorporare e accedere alle risorse utilizzando C#

Il presente articolo è stato tradotto tramite il software di traduzione automatica di Microsoft e non da una persona. Microsoft offre sia articoli tradotti da persone fisiche sia articoli tradotti automaticamente da un software, in modo da rendere disponibili tutti gli articoli presenti nella nostra Knowledge Base nella lingua madre dell’utente. Tuttavia, un articolo tradotto in modo automatico non è sempre perfetto. Potrebbe contenere errori di sintassi, di grammatica o di utilizzo dei vocaboli, più o meno allo stesso modo di come una persona straniera potrebbe commettere degli errori parlando una lingua che non è la sua. Microsoft non è responsabile di alcuna imprecisione, errore o danno cagionato da qualsiasi traduzione non corretta dei contenuti o dell’utilizzo degli stessi fatto dai propri clienti. Microsoft, inoltre, aggiorna frequentemente il software di traduzione automatica.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 319292
Per la una versione di Microsoft Visual Basic .NET di questo articolo, vedere 319291.

Questo articolo si riferisce ai seguenti spazi dei nomi delle librerie di classi di Microsoft .NET Framework:
  • System.Reflection
  • System.IO

Contenuto dell'attività

Sommario
In questo articolo viene descritto come utilizzare Visual C# per incorporare le risorse come parte dell'assembly e quindi accedere alle risorse in fase di esecuzione.

back to the top

Cenni preliminari

.NET Framework è possibile incapsulare i file come parte di un assembly compilato. Questi file vengono definiti come risorse incorporate. Queste risorse sono completamente separate dai file resources e RESX associati con l'assembly. Puoi accedere a queste risorse in fase di esecuzione tramite la classe assembly di spazio dei nomi System.Reflection .

Un vantaggio principale di incorporare le risorse del manifesto è che poiché i file fanno parte dell'assembly compilato, accidentalmente l'utente non può eliminare o smarrire il file che sono fondamentali per l'applicazione, che, in alcuni casi, potrebbe impedire l'esecuzione del programma. Unica limitazione di questo approccio è che è Impossibile salvare le modifiche a questo file all'assembly senza ricompilare il programma. Di conseguenza, solo file di inclusione non cambierà tutta la durata dell'applicazione come risorsa incorporata.

back to the top

Esempio passo passo

Per aggiungere le risorse incorporate nel progetto, è innanzitutto necessario aggiungere i file come parte del progetto. Dopo aver aggiunto i file al progetto, è possibile accedere e visualizzare le risorse tramite lo spazio dei nomi System.Reflection .

back to the top

Aggiungere risorse incorporate

Per aggiungere un file di testo e un file di immagine al progetto come risorse incorporate, attenersi alla seguente procedura:
  1. Creare un nuovo progetto applicazione Windows per questa dimostrazione. Questo modulo viene utilizzato per visualizzare le risorse accessibili dall'assembly in esecuzione durante la fase di esecuzione.
  2. Fare clic con il pulsante destro del mouse sul nome del progetto, fare clic su Aggiungi , quindi scegliere Aggiungi nuovo elemento .
  3. Nella finestra di dialogo Nuovo elemento selezionare File di testo dal menu e nome del file MyTextFile.txt. Quando il file viene aperto nell'ambiente di sviluppo integrato (IDE, Integrated Development Environment), aggiungere del testo e quindi chiudere il file.
  4. Ripetere i passaggi 1 e 2 per aggiungere un'immagine bitmap al progetto, ma invece di selezionare il File di testo come nuovo tipo di elemento, selezionare File Bitmap e quindi modificare il nome di file in MyImage.bmp . Quando la nuova immagine viene aperto nell'IDE, disegnare qualcosa sull'immagine e quindi chiudere il file.
  5. Fare clic con il pulsante destro del mouse sul file di testo o l'immagine bitmap e quindi scegliere Proprietà .
  6. Nella finestra di dialogo Proprietà individuare la proprietà di Operazione di generazione . Per impostazione predefinita, questa proprietà è impostata su contenuto . Selezionare la proprietà e modificare la proprietà Operazione di generazione su Risorsa incorporata .
  7. Ripetere i passaggi 4 e 5 per l'altro file.
Alla successiva che generazione del progetto, il compilatore aggiunge i file all'assembly. Il compilatore aggiunge spazio dei nomi root del progetto al nome della risorsa quando si è incluso nel progetto. Ad esempio, nel caso di MyNamespace spazio dei nomi root del progetto, le risorse sono denominate MyNamespace.MyTextFile.txt e MyNamespace.MyImage.bmp.

Nota : I nomi di file di risorse sono con distinzione tra maiuscole e minuscole. Quando si accedere alle risorse, è necessario utilizzare il controllo ortografico esatta e di un caso del nome del file. Se non si utilizza l'ortografia esatta e caso di estensione, la chiamata di metodo per accedere al ManifestResourceStream restituisce Nothing e il sistema non genera un'eccezione.

Nota : se si desidera verificare i nomi delle risorse, è possibile utilizzare Microsoft Intermediate Language Disassembler (ILDASM) per visualizzare i dati manifesti, in cui sono elencate le risorse incluse.

back to the top

Risorse di accesso

Per accedere alle risorse è stato incorporato del manifesto dell'assembly, importare il System.IO e gli spazi dei nomi System.Reflection , come illustrato di seguito:
   using System.IO;   using System.Reflection;				
lo spazio dei nomi System.IO fornisce la definizione di un flusso e lo spazio dei nomi System.Reflection definisce la classe assembly che fornisce metodi per accedere alle risorse incorporati nell'assembly.

Quando si dichiarano seguenti operazioni nell'area di dichiarazione generale, le risorse dall'assembly vengono letti quando il form viene caricato:
   Assembly _assembly;   Stream _imageStream;   StreamReader _textStreamReader;				
Nota : per accedere all'evento Load del form nell'editor di codice, fare doppio clic nell'editor di progettazione form.

Per leggere la risorsa dall'assembly in esecuzione il codice corrente, è necessario ottenere un'istanza di tale assembly. Per effettuare questa operazione, utilizzare il metodo di GetExecutingAssembly dell'assembly, come illustrato di seguito:
   _assembly = Assembly.GetExecutingAssembly();				
lettura le informazioni dalla risorsa in un flusso viene eseguita con una chiamata di metodo GetManifestResourceStream . Il parametro passato a questo metodo è il nome della risorsa che è possibile accedere. Le due risorse quindi vengono letti i flussi corrispondente quando si esegue l'evento Load del form.
   _imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp");   _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));				
il codice nell'evento Load per il modulo analogo al seguente:
   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'istruzione Try-catch , noto come Gestione errori strutturata in. NET, consente di rilevare eventuali errori verificatisi durante l'istanza della classe assembly accede le risorse.

back to the top

Visualizzazione risorse

In questo esempio utilizza due pulsanti per visualizzare le risorse incorporate. Quando si fa clic sul primo pulsante, un'immagine bitmap è basata sulla risorsa che viene letto dall'assembly è creata e visualizzata nel controllo PictureBox del modulo. Il secondo pulsante da una risorsa di testo e visualizzato il testo in una casella di testo.

Per visualizzare le risorse incorporate, attenersi alla seguente procedura:
  1. Aggiungere al form un controllo PictureBox .
  2. Aggiungere un nuovo controllo pulsante al form e quindi modificare la proprietà Text per Mostra immagine .
  3. Fare doppio clic sul pulsante per aprire relativo evento Click nel Visualizzatore di codice e incollarlo nel codice riportato di seguito in questo caso:
       try   {      pictureBox1.Image = new Bitmap(_imageStream);			       }   catch    {      MessageBox.Show("Error creating image!");   }					
    questo codice genera una nuova istanza di una bitmap si basa il flusso di risorse che è stato letto nell'evento Load del form.

  4. Aggiungere un controllo TextBox al form.
  5. Aggiungere un altro controllo Button al form e quindi modificare la proprietà Text in Testo Get .
  6. Fare doppio clic sul pulsante nell'editor di progettazione per aprire il Click_Event per il pulsante e quindi incollare il codice seguente nell'evento:
       try   {      if(_textStreamReader.Peek() != -1)      {         textBox1.Text = _textStreamReader.ReadLine();      }   }   catch   {      MessageBox.Show("Error writing text!");   }					
    questo codice determina se i caratteri da leggere è ancora presenti nel flusso. Se vengono trovati caratteri, viene letta una riga alla casella di testo.

  7. Premere F5 per eseguire l'applicazione.
back to the top

Codice completo

   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!");            }		         }      }   }				
Nota Il codice deve essere modificato in Visual Studio 2005 o in Visual Studio 2008. Quando si crea un progetto Windows Form, Visual C# aggiunge un form al progetto per impostazione predefinita. Questo modulo denominato Form1. I due file che rappresentano il form sono denominati Form1.cs e Form1.Designer.cs. Il codice scritto in Form1.cs. Il file Designer.cs è Progettazione Windows Form scrive il codice che implementa tutte le azioni eseguite mediante l'aggiunta di controlli. Per ulteriori informazioni su Progettazione Windows Form in Visual C# 2005 o in Visual Studio 2008, visitare il sito di Web di Microsoft:back to the top

Risoluzione dei problemi

Poiché i nomi delle risorse sono con distinzione tra maiuscole e minuscole, verificare che si stia utilizzando l'ortografia corretta e di un caso delle risorse a cui si accede. È possibile utilizzare ILDASM per leggere i dati per verificare l'ortografia esatta delle risorse di manifesti.

back to the top
Riferimenti
Per ulteriori informazioni, visitare i seguenti siti Web di Microsoft Developer Network (MSDN) (informazioni in lingua inglese): back to the top

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 319292 - Ultima revisione: 07/15/2008 03:11:46 - Revisione: 3.1

Microsoft Visual C# .NET 2002 Standard Edition, Microsoft Visual C# 2005 Express Edition, Microsoft Visual C# 2008 Express Edition

  • kbmt kbsweptvs2008 kbhowtomaster KB319292 KbMtit
Feedback