Wie verwende ich eingebettete Ressourcen in
C#?
Diese Schritt-für-Schritt-Anleitung zeigt, wie Sie mit C# eine Ressource als Teil einer Assembly einbetten und dann zur Laufzeit auf die Ressource zugreifen.
Das .NET Framework kann Dateien als Teil einer kompilierten Assembly kapseln. Diese Dateien werden eingebettete Ressourcen genannt. Diese Ressourcen sind vollständig separate Assemblys, die mit .resources- und .resx-Dateien verknüpft sind. Sie können zur Laufzeit über die Klasse Assembly im Namespace System.Reflection auf diese Ressourcen zugreifen.
Der Hauptvorteil eingebetteter Manifestressourcen besteht darin, dass Benutzer sie nicht versehentlich löschen oder versehentlich in Ihre Anwendung einfügen können, da diese Dateien Teil der kompilierten Assembly sind, was in einigen Fällen der Fall sein kann Wichtige Dateien können die Ausführung des Programms verhindern. Eine Einschränkung dieses Ansatzes besteht darin, dass Sie keine Änderungen an der Assembly dieser Datei speichern können, ohne das Programm neu zu kompilieren. Aus diesem Grund sollten Sie nur Dateien als eingebettete Ressourcen einbeziehen, die sich während der Lebensdauer der Anwendung nicht ändern.
Um eingebettete Ressourcen zu Ihrem Projekt hinzuzufügen, müssen Sie diese Dateien zunächst als Teil Ihres Projekts hinzufügen. Nachdem Sie Dateien zu Ihrem Projekt hinzugefügt haben, können Sie auf Ressourcen im Namespace System.Reflection zugreifen und diese anzeigen.
Um Textdateien und Bilddateien zum Einbetten als Ressourcen in Ihr Projekt hinzuzufügen, führen Sie die folgenden Schritte aus:
Erstellen Sie ein neues Windows-Anwendungsprojekt für diese Demo. Dieses Formular wird verwendet, um die Ressourcen anzuzeigen, auf die zur Laufzeit von einer ausführenden Assembly aus zugegriffen wird.
Klicken Sie mit der rechten Maustaste auf den Projektnamen, klicken Sie auf Hinzufügen und dann auf Neues Element hinzufügen
Wählen Sie im Dialogfeld Neues Projekt die Option Textdatei aus dem Menü aus und nennen Sie die Datei MyTextDatei.txt. Öffnen Sie die Datei in der integrierten Entwicklungsumgebung (IDE), fügen Sie Text hinzu und schließen Sie die Datei.
Wiederholen Sie die Schritte 1 und 2, um das Bitmap-Bild zum Projekt hinzuzufügen. Wählen Sie jedoch anstelle von Textdatei als neuen Projekttyp Bitmap-Datei aus und ändern Sie dann den Dateinamen in MyImage.bmp. Wenn Sie ein neues Bild in der IDE öffnen, wird der Inhalt auf das Bild gezeichnet und anschließend wird die Datei geschlossen.
Klicken Sie mit der rechten Maustaste auf den Dateitext oder die Bitmap und wählen Sie Eigenschaften
Im Eigenschaften nach der Eigenschaft Build-Aktion. Standardmäßig ist diese Eigenschaft auf Inhalt gesetzt. Klicken Sie auf die Eigenschaft und ändern Sie die Eigenschaft Build Action in Embedded Resource
Bitte beachten Sie: Bei Ressourcendateinamen muss die Groß-/Kleinschreibung beachtet werden. Beim Zugriff auf eine Ressource müssen Sie die genaue Schreibweise und Groß-/Kleinschreibung des Dateinamens verwenden. Wenn Sie nicht die genaue Schreibweise und Groß-/Kleinschreibung des Dateinamens verwenden, führt der Methodenaufruf für den Zugriff auf ManifestResourceStream keine Aktion aus zurück und das System führt keine Auslösung durch abnormal.
Hinweis: Wenn Sie diese Ressourcennamen überprüfen möchten, können Sie den Microsoft Intermediate Language Disassembler (ILDASM) verwenden, um die Manifestdaten anzuzeigen, in denen die enthaltenen Ressourcen aufgeführt sind.
System.IO und System.Reflection Namespace, wie folgt: Der
using System.IO; using System.Reflection;
System.IO-Namespace bietet Definitionen von Streams und Methoden von Klassen, die von Assemblys bereitgestellt werden, die im System.Reflection-Namespace definiert sind, für den Zugriff In die Baugruppe eingebettete Ressourcen.
Ressourcen aus der Assembly lesen, wenn das Formular geladen wird, wenn es im folgenden allgemeinen Deklarationsbereich deklariert wird:
Assembly _assembly; Stream _imageStream; StreamReader _textStreamReader;
Hinweis: Um auf das Formular zuzugreifen Laden SieEreignis des Formulars im Code-Editor, doppelklicken Sie bitte im Design-Editor auf das Formular.
Um Ressourcen aus einer Assembly zu lesen, in der der aktuelle Code ausgeführt wird, müssen Sie eine Instanz dieser Assembly abrufen. Verwenden Sie dazu die Methode GetExecutingAssembly der Assembly wie folgt:
_assembly = Assembly.GetExecutingAssembly();
Um Informationen aus einer Ressource in einen Stream einzulesen, verwenden Sie GetManifestResourceStream. Der Methodenaufruf lautet hingerichtet. Der an diese Methode übergebene Parameter ist der Name der Ressource, auf die zugegriffen werden soll. Führen Sie das Load-Ereignis des Formulars aus und lesen Sie dann die beiden Ressourcen in ihre entsprechenden Streams ein.
_imageStream = _assembly.GetManifestResourceStream("MyNameSpace.MyImage.bmp"); _textStreamReader = new StreamReader(_assembly.GetManifestResourceStream("MyNameSpace.MyTextFile.txt"));
Der Code im Load-Ereignis des Formulars lautet wie folgt:
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-Anweisung, genannt In .NET wird die strukturierteFehlerbehandlung verwendet, um alle Fehler abzufangen, die auftreten können, wenn eine Instanz einer Assembly-Klasse auf eine Ressource zugreift.
In diesem Beispiel werden zwei -Schaltflächen verwendet, um eingebettete Ressourcen anzuzeigen. Wenn auf die erste Schaltfläche geklickt wird, wird ein Bitmap-Bild basierend auf der aus der Baugruppe gelesenen Ressource erstellt und im Bild-FeldSteuerelement des Formulars angezeigt. Die Textressource der zweiten Schaltfläche wird gelesen und der Text im Textfeld angezeigt.
Um eine eingebettete Ressource anzuzeigen, führen Sie die folgenden Schritte aus:
Fügen Sie dem Formular ein Bildfeld-Steuerelement hinzu.
Fügen Sie ein neues Button-Steuerelement zum Formular hinzu und ändern Sie dann seine Text-Eigenschaft in Display Image
Doppelklicken Sie auf die Schaltfläche, um das zugehörige Click-Ereignis im Code-Viewer zu öffnen, und fügen Sie dann in diesem Fall den folgenden Code ein:
try { pictureBox1.Image = new Bitmap(_imageStream); } catch { MessageBox.Show("Error creating image!"); }
Dieser Code generiert eine neue Instanz basierend auf der Bitmap des Ressourcenstreams, die im Load-Ereignis des Formulars gelesen wird.
Fügen Sie dem Formular ein TextBox-Steuerelement hinzu.
Fügen Sie dem Formular ein weiteres Button-Steuerelement hinzu und ändern Sie dann dessen Eigenschaft Text in Get Text
Doppelklicken Sie auf die Schaltfläche im Design-Editor, um das Click_Event zu öffnen, und fügen Sie dann den folgenden Code in das Ereignis ein:
try { if(_textStreamReader.Peek() != -1) { textBox1.Text = _textStreamReader.ReadLine(); } } catch { MessageBox.Show("Error writing text!"); }
Dieser Code bestimmt, ob das zu lesende Zeichen noch im Stream vorhanden ist. Wenn das Zeichen gefunden wird, liest das Textfeld die Zeile.
Drücken Sie F5, um die Anwendung auszuführen.
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!"); } } } }
HINWEISWenn Sie Visual Studio 2005 oder Visual Studio 2008 verwenden, sollten Sie den Code ändern. Wenn Sie ein Windows Forms-Projekt erstellen, fügt Visual C# dem Projekt standardmäßig ein Formular hinzu. Dieses Formular heißt Form1. Die beiden Dateien, die das Formular darstellen, werden aufgerufen Form1.cs und Form1.designer.cs. Schreiben Sie Ihren Code in Form1.cs. Die Datei „Designer.cs“ ist der vom Windows Forms-Designer geschriebene Code, der alle Aktionen implementiert, die Sie durch Hinzufügen von Steuerelementen ausführen. Weitere Informationen zum Windows Forms Designer in Visual C# 2005 oder Visual Studio 2008 finden Sie unten bei Microsoft Website:
http://msdn2.microsoft.com/en-us/library/ms173077.aspx
Aufgrund von Bei Ressourcennamen muss die Groß-/Kleinschreibung beachtet werden. Bitte stellen Sie sicher, dass Sie beim Zugriff auf die Ressource die richtige Schreibweise und Groß-/Kleinschreibung verwenden. Mit ILDASM können Sie die Daten des Manifests lesen, um die genaue Schreibweise einer Ressource zu überprüfen.
Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung der Einbettung und Verwendung von C# für den Zugriff auf Ressourcencode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!