Come incorporare e accedere alle risorse utilizzando C#

Traduzione articoli Traduzione articoli
Identificativo articolo: 319292 - Visualizza i prodotti a cui si riferisce l?articolo.
Espandi tutto | Chiudi tutto

In questa pagina

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.

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.

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 .

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.

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.

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.

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:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx

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.

Riferimenti

Per ulteriori informazioni, visitare i seguenti siti Web di Microsoft Developer Network (MSDN) (informazioni in lingua inglese):
Spazio dei nomi 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

Metodo assembly.GetManifestResourceStream
http://msdn2.microsoft.com/en-us/library/system.reflection.assembly.getmanifestresourcestream(vs.71).aspx

ProprietÓ

Identificativo articolo: 319292 - Ultima modifica: martedý 15 luglio 2008 - Revisione: 3.1
Le informazioni in questo articolo si applicano a:
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Visual C# 2005 Express Edition
  • Microsoft Visual C# 2008 Express Edition
Chiavi:á
kbmt kbsweptvs2008 kbhowtomaster KB319292 KbMtit
Traduzione automatica articoli
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
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.

Invia suggerimenti

 

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