Τρόπος ενσωμάτωσης και πρόσβαση σε πόρους με χρήση Visual C#

Για την Microsoft Visual Basic .NET έκδοση αυτού του άρθρου, ανατρέξτε στην ενότητα 319291 .


Αυτό το άρθρο αναφέρεται από τα παρακάτω πεδία ονομάτων βιβλιοθήκη κλάσης του Microsoft .NET Framework:
  • System.Reflection
  • System.IO

ΣΕ ΑΥΤΉΝ ΤΗΝ ΕΡΓΑΣΊΑ

Σύνοψη

Αυτό το άρθρο βήμα προς βήμα περιγράφει τον τρόπο χρήσης της Visual C# για να ενσωματώσετε πόρων ως μέρος της συγκρότησης και στη συνέχεια πρόσβαση στους πόρους κατά το χρόνο εκτέλεσης.


Επισκόπηση

Το .NET Framework να ενσωματώσετε αρχεία ως μέρος της μια μεταγλωττισμένη συγκρότηση. Τα αρχεία αυτά είναι γνωστά ως ενσωματωμένο πόρους. Αυτοί οι πόροι είναι εντελώς ξεχωριστά από τα .resources και .resx αρχεία που σχετίζονται με τη συγκρότηση. Μπορείτε να αποκτήσετε πρόσβαση σε αυτούς τους πόρους κατά το χρόνο εκτέλεσης, μέσω της κλάσης συγκρότησης του χώρου ονομάτων System.Reflection .

Ένα μεγάλο πλεονέκτημα του ενσωμάτωση πόρους για τη διακήρυξη είναι ότι επειδή τα αρχεία είναι μέρος του σας μεταγλωττισμένη συγκρότηση, ο χρήστης δεν κατά λάθος διαγράψετε ή να χάσετε τα αρχεία που είναι κρίσιμες για την εφαρμογή σας, το οποίο, σε ορισμένες περιπτώσεις, μπορεί να εμποδίσει την εκτέλεση του προγράμματος. Ένας περιορισμός αυτής της προσέγγισης είναι ότι δεν μπορείτε να αποθηκεύσετε τις αλλαγές σε αυτό το αρχείο στη συγκρότηση χωρίς νέα μεταγλώττιση του προγράμματος. Για το λόγο αυτό, να περιλαμβάνει μόνο αρχεία που δεν θα αλλάξει κατά τη διάρκεια ζωής της εφαρμογής σας ως έναν ενσωματωμένο πόρο.


Βήμα προς βήμα επίδειξης

Για να προσθέσετε το ενσωματωμένο πόρους στο έργο σας, πρέπει πρώτα να προσθέσετε τα αρχεία ως μέρος του έργου σας. Αφού προσθέσετε τα αρχεία στο έργο σας, μπορείτε να έχετε πρόσβαση και να εμφανίζει τους πόρους μέχρι το χώρο ονομάτων System.Reflection .


Προσθήκη ενσωματωμένου πόρων

Για να προσθέσετε ένα αρχείο κειμένου και ένα αρχείο εικόνας στο έργο σας ως ενσωματωμένο πόρους, ακολουθήστε τα εξής βήματα:
  1. Δημιουργήστε ένα νέο έργο εφαρμογών των Windows για αυτήν την επίδειξη. Η φόρμα αυτή χρησιμοποιείται για την απεικόνιση των πόρων που είναι προσπελάσιμα από τη συγκρότηση εκτέλεσης κατά το χρόνο εκτέλεσης.
  2. Κάντε δεξιό κλικ στο όνομα του έργου σας, κάντε κλικ στο κουμπί Προσθήκηκαι, στη συνέχεια, κάντε κλικ στην επιλογή Προσθήκη νέου στοιχείου.
  3. Στο πλαίσιο διαλόγου " Νέο στοιχείο ", επιλέξτε το Αρχείο κειμένου από το μενού και ονομάστε το αρχείο MyTextFile.txt. Όταν το αρχείο ανοίγει με το ενσωματωμένο περιβάλλον ανάπτυξης (IDE), προσθέστε κάποιο κείμενο και, στη συνέχεια, κλείστε το αρχείο.
  4. Επαναλάβετε τα βήματα 1 και 2 για να προσθέσετε μια εικόνα bitmap στο έργο σας, αλλά αντί να επιλέξετε Αρχείο κειμένου ως το νέο τύπο στοιχείου, επιλέξτε Αρχείο Bitmapκαι, στη συνέχεια, αλλάξτε το όνομα αρχείου για να MyImage.bmp. Όταν ανοίξει η νέα εικόνα στο IDE, σχεδιάστε κάτι στην εικόνα και, στη συνέχεια, κλείστε το αρχείο.
  5. Κάντε δεξιό κλικ στο αρχείο κειμένου ή το bitmap, και στη συνέχεια επιλέξτε την εντολή Ιδιότητες.
  6. Στο πλαίσιο διαλόγου " Ιδιότητες ", εντοπίστε την ιδιότητα Action Δόμηση . Από προεπιλογή, αυτή η ιδιότητα ορίζεται σε περιεχομένου. Κάντε κλικ στην ιδιότητα και να αλλάξετε την ιδιότητα Action Δόμηση Ενσωματωμένοπόρο.
  7. Επαναλάβετε τα βήματα 4 και 5 για το άλλο αρχείο.
Την επόμενη φορά που θα δομήσετε το έργο, το πρόγραμμα μεταγλώττισης προσθέτει αυτά τα αρχεία της συγκρότησης. Το πρόγραμμα μεταγλώττισης προσθέτει το χώρο ονομάτων ρίζας του έργου στο όνομα του πόρου, όταν περιλαμβάνεται στο έργο. Για παράδειγμα, εάν το χώρο ονομάτων ρίζας του έργου σας είναι MyNamespace, τους πόρους που ονομάζονται MyNamespace.MyTextFile.txt και MyNamespace.MyImage.bmp.


ΣΗΜΕΊΩΣΗ: τα ονόματα των αρχείων πόρων διάκριση πεζών-κεφαλαίων. Όταν αποκτάτε πρόσβαση στους πόρους, πρέπει να χρησιμοποιήσετε το ακριβές και υπόθεσης του ονόματος αρχείου. Εάν δεν χρησιμοποιείτε το ακριβές και υπόθεσης του ονόματος αρχείου, η κλήση της μεθόδου πρόσβασης το ManifestResourceStream επιστρέφει τίποτακαι το σύστημα δεν ενεργοποιεί μια εξαίρεση.


ΣΗΜΕΊΩΣΗ: Εάν θέλετε να επαληθεύσετε τα ονόματα των πόρων, μπορείτε να χρησιμοποιήσετε το Microsoft ενδιάμεση γλώσσα αποκωδικοποιητής (το ILDASM) για να προβάλετε τα δεδομένα δήλωσης, όπου παρατίθενται σε λίστα στους πόρους περιλαμβάνονται.


Πρόσβαση σε πόρους

Για να αποκτήσετε πρόσβαση στους πόρους που έχουν ενσωματωμένα στη διακήρυξη της συγκρότησης, εισαγάγετε το System.IO και τα πεδία ονομάτων System.Reflection , ως εξής:
   using System.IO;   using System.Reflection;

Ο χώρος ονομάτων System.IO παρέχει τον ορισμό μιας ροής και του χώρου ονομάτων System.Reflection Καθορίζει την κλάση συγκρότησης που παρέχει μεθόδους για την πρόσβαση στους πόρους που είναι ενσωματωμένα σε της συγκρότησης.


Όταν δηλώνετε τα παρακάτω στην περιοχή δήλωση γενικών στοιχείων, οι πόροι από τη συγκρότηση διαβάζονται όταν έχει φορτωθεί η φόρμα:
   Assembly _assembly;   Stream _imageStream;
StreamReader _textStreamReader;

ΣΗΜΕΊΩΣΗ: για την πρόσβαση στο συμβάν φόρτωσης της φόρμας στο πρόγραμμα επεξεργασίας κώδικα, κάντε διπλό κλικ στο πρόγραμμα επεξεργασίας σχεδίασης φόρμας.


Για να διαβάσετε τον πόρο από τη συγκρότηση που εκτελεί τον κώδικα, πρέπει να αποκτήσετε μια παρουσία αυτής της συγκρότησης. Για να γίνει αυτό, χρησιμοποιήστε τη μέθοδο GetExecutingAssembly της συνέλευσης, ως εξής:
   _assembly = Assembly.GetExecutingAssembly();
Ανάγνωση των πληροφοριών από τον πόρο σε ροή πραγματοποιείται με μια κλήση μεθόδου στην GetManifestResourceStream. Η παράμετρος που μεταβιβάζεται σε αυτήν τη μέθοδο είναι το όνομα του πόρου που πρόκειται να είναι δυνατή η πρόσβαση. Οι δύο πόροι, στη συνέχεια, διαβάζονται τις αντίστοιχες ροές, καθώς εκτελείται το συμβάν φόρτωσης της φόρμας.

   _imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp");   _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));

Παρόμοιο με το ακόλουθο κώδικα στο συμβάν φόρτωσης της φόρμας:

   try   {
_assembly = Assembly.GetExecutingAssembly();
_imageStream = _assembly.GetManifestResourceStream("MyNamespace.MyImage.bmp");
_textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNamespace.MyTextFile.txt"));
}
catch
{
MessageBox.Show("Error accessing resources!");
}

Η πρόταση Try-Catch , γνωστή ως δομημένη λάθος χειρισμό στο .NET, χρησιμοποιείται για τον εντοπισμό τυχόν σφάλματα που ενδέχεται να προκύψει όταν η παρουσία της κλάσης συγκρότησης έχει πρόσβαση στους πόρους.


Εμφάνιση πόρων

Αυτό το παράδειγμα χρησιμοποιεί δύο κουμπιά για να εμφανίσετε το ενσωματωμένο πόρους. Όταν κάνετε κλικ στο πρώτο κουμπί, μια εικόνα bitmap που βασίζεται στον πόρο που διαβάζεται από τη συγκρότηση δημιουργείται και εμφανίζεται στο PictureBox στοιχείο ελέγχου της φόρμας. Το δεύτερο κουμπί διαβάζει από έναν πόρο, κείμενο και εμφανίζει το κείμενο σε ένα πλαίσιο κειμένου.


Για να εμφανίσετε το ενσωματωμένο πόρους, ακολουθήστε τα εξής βήματα:
  1. Προσθήκη ενός στοιχείου ελέγχου PictureBox στη φόρμα.
  2. Προσθέστε ένα νέο στοιχείο ελέγχου κουμπιού στη φόρμα και στη συνέχεια αλλάξτε την ιδιότητα Text σε Εμφάνιση εικόνας.
  3. Κάντε διπλό κλικ στο κουμπί για να ανοίξετε το συμβάν , κάντε κλικ στο πρόγραμμα προβολής κώδικα και, στη συνέχεια, επικολλήστε τον παρακάτω κώδικα σε αυτό το συμβάν:
       try   {
    pictureBox1.Image = new Bitmap(_imageStream); }
    catch
    {
    MessageBox.Show("Error creating image!");
    }

    Αυτός ο κώδικας δημιουργεί μια νέα παρουσία του bitmap που βασίζεται στη ροή πόρων που διαβάστηκε στο συμβάν φόρτωσης της φόρμας.

  4. Προσθέστε ένα στοιχείο ελέγχου πλαισίου κειμένου στη φόρμα.
  5. Προσθέστε ένα άλλο στοιχείο ελέγχου κουμπιού στη φόρμα και στη συνέχεια αλλάξτε την ιδιότητα κειμένου σε Λήψη κειμένου.
  6. Κάντε διπλό κλικ στο κουμπί με το πρόγραμμα επεξεργασίας σχεδίασης για να ανοίξετε το Click_Event για το κουμπί και, στη συνέχεια, επικολλήστε τον ακόλουθο κώδικα στο συμβάν:
       try   {
    if(_textStreamReader.Peek() != -1)
    {
    textBox1.Text = _textStreamReader.ReadLine();
    }
    }
    catch
    {
    MessageBox.Show("Error writing text!");
    }

    Αυτός ο κωδικός προσδιορίζει αν χαρακτήρες να διαβαστεί εξακολουθούν να υπάρχουν στη ροή. Εάν δεν βρεθεί χαρακτήρες, μια γραμμή είναι για ανάγνωση στο πλαίσιο κειμένου.

  7. Πατήστε F5 για να εκτελέσετε την εφαρμογή.

Πλήρη κώδικα

   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!");
}
}
}
}

Σημείωση Ο κωδικός πρέπει να αλλάξει στο Visual Studio 2005 ή το Visual Studio 2008. Όταν δημιουργείτε ένα έργο Windows φόρμες, Visual C# προσθέτει μία φόρμα στο έργο από προεπιλογή. Αυτή η φόρμα ονομάζεται Form1. Τα δύο αρχεία που αντιπροσωπεύει τη φόρμα ονομάζονται Form1.cs και Form1.designer.cs. Συντάξτε τον κώδικά σας στο Form1.cs. Το αρχείο Designer.cs είναι όπου ο σχεδιαστής Windows εγγράφει τον κώδικα που υλοποιεί όλες τις ενέργειες που εκτελέσατε προσθέτοντας στοιχεία ελέγχου. Για περισσότερες πληροφορίες σχετικά με τη σχεδίαση φορμών Windows στο Visual C# 2005 ή το Visual Studio 2008, επισκεφθείτε την ακόλουθη τοποθεσία της Microsoft στο Web:

Αντιμετώπιση προβλημάτων

Επειδή τα ονόματα πόρων διάκριση πεζών-κεφαλαίων, βεβαιωθείτε ότι χρησιμοποιείτε τη σωστή ορθογραφία και υπόθεση των πόρων που είναι προσπελάσιμα. Μπορείτε να χρησιμοποιήσετε το ILDASM για να διαβάσετε τα δεδομένα δήλωσης για να επαληθεύσετε το ακριβές των πόρων.


Αναφορές

Για περισσότερες πληροφορίες, ανατρέξτε στις ακόλουθες τοποθεσίες της Microsoft Developer Network (MSDN) στο Web:
Ιδιότητες

Αναγνωριστικό άρθρου: 319292 - Τελευταία αναθεώρηση: 17 Ιαν 2017 - Αναθεώρηση: 1

Σχόλια