Jak vložit a přístup k prostředkům pomocí aplikace Visual C#

Microsoft Visual Basic .NET verzi tohoto článku naleznete 319291 .


Tento článek se týká následujících oborů názvů knihovny tříd rozhraní.NET Framework společnosti Microsoft:
  • System.Reflection
  • System.IO

V TOMTO ÚKOLU

Souhrn

Tento podrobný článek popisuje, jak pomocí jazyka Visual C# vložit prostředky jako část sestavení a poté získat přístup k prostředkům v době běhu.


Přehled

Rozhraní.NET Framework můžete zapouzdřit soubory jako součást kompilované sestavení. Tyto soubory jsou známé jako vložené prostředky. Tyto prostředky jsou zcela oddělené od Resources a resx soubory, které jsou přidruženy k sestavení. Tyto prostředky můžete přistupovat v době běhu pomocí třídy sestavení oboru názvů System.Reflection .

Hlavní výhodou vkládání prostředky manifestu je, že vzhledem k tomu, že soubory jsou součástí zkompilované sestavení, uživatel nemůže náhodnému odstranění nebo někam nezaložili soubory, které jsou důležité pro aplikace, které v některých případech může zabránit spuštění programu. Jeden omezení tento přístup je, že nelze uložit změny do tohoto souboru sestavení bez nutnosti znovu kompilovat program. Z tohoto důvodu obsahují pouze soubory, které nemění během životnosti aplikace jako integrovaný zdroj.


Podrobnou demonstraci

Pokud chcete přidat vložené prostředky projektu, musíte nejprve přidat soubory jako část projektu. Po přidání souborů do projektu, můžete získat přístup a zobrazit zdroje až System.Reflection obor názvů.


Přidat vložené prostředky

Chcete-li přidat textový soubor a soubor bitové kopie do projektu jako vložené prostředky, postupujte takto:
  1. Vytvořte nový projekt aplikace systému Windows pro tuto ukázku. Tento formulář slouží k zobrazení prostředků, které jsou přístupné z vykonávajícího sestavení za běhu.
  2. Klepněte pravým tlačítkem na název projektu, klepněte na tlačítko Přidata potom klepněte na tlačítko Přidat novou položku.
  3. V dialogovém okně Nová položka vyberte Textový soubor z nabídky a zadejte název souboru MyTextFile.txt. Při otevření souboru v integrované vývojové prostředí (IDE), přidejte nějaký text a potom zavřete soubor.
  4. Opakujte kroky 1 a 2 přidejte bitmapového obrazu do projektu, ale namísto výběru Textový soubor jako nový typ položky, vyberte Soubor rastrového obrázkua poté změňte název souboru MyImage.bmp. Při otevření nového obrazu v IDE, nakreslete něco na obrázek a potom zavřete soubor.
  5. Klepněte pravým tlačítkem myši na textový soubor nebo bitmapy a vyberte příkaz Vlastnosti.
  6. V dialogovém okně Vlastnosti vyhledejte vlastnost Akce sestavení . Ve výchozím nastavení je tato vlastnost nastavena na obsah. Klepněte na tlačítko Vlastnosti a změňte vlastnost Akce sestavení na Integrovaný prostředek.
  7. Opakujte kroky 4 a 5 pro druhý soubor.
Při příštím vytváření projektu, kompilátor přidá tyto soubory do vašeho sestavení. Kompilátor přidá kořenový obor názvů projektu název prostředku, pokud je součástí projektu. Například je-li kořenový obor názvů projektu MyNamespace, prostředky jsou pojmenovány MyNamespace.MyTextFile.txt a MyNamespace.MyImage.bmp.


Poznámka: názvy souborů prostředků jsou rozlišována. Při přístupu k prostředkům, musíte použít přesný pravopis a případ název souboru. Pokud používáte přesný pravopis a případ název souboru, volání metody přístup ManifestResourceStream vrátí nica systém nevyvolává výjimku.


Poznámka: Pokud chcete ověřit názvy zdrojů, můžete použít Microsoft Disassembler pro Intermediate Language (ILDASM) Chcete-li zobrazit manifestu data, která uvádí zahrnuty prostředky.


Přístup k prostředkům

Chcete-li získat přístup k prostředkům, které jsou vloženy v manifestu sestavení, importujte System.IO a obory názvů System.Reflection , takto:
   using System.IO;   using System.Reflection;

Obor názvů System.IO obsahuje definici datového proudu a obor názvů System.Reflection definuje sestavení třída, která poskytuje metody pro přístup k prostředkům, které jsou vloženy v sestavení.


Při deklaraci v oblasti Obecné prohlášení následující zdroje ze sestavení jsou čtení při načtení formuláře:
   Assembly _assembly;   Stream _imageStream;
StreamReader _textStreamReader;

Poznámka: Chcete-li získat přístup k události Load formuláře v editoru kódu, poklepejte na formulář v editoru návrh.


Načíst prostředek ze sestavení, který je prováděn aktuální kód, musíte získat instanci sestavení. Chcete-li to provést, použijte GetExecutingAssembly způsob sestavení, takto:
   _assembly = Assembly.GetExecutingAssembly();
Čtení informací ze zdroje do datového proudu se provádí pomocí volání metody GetManifestResourceStream. Parametr, který je předán do této metody je název prostředku, který je přístupný. Dva zdroje jsou pak takto do jejich odpovídajících datových proudů je proveden události Load formuláře.

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

Podobná následující kód v události Load formulář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!");
}

Příkaz Try-Catch , známý jako strukturované chyba zpracování v .NET, slouží k odhalení případných chyb, které mohly nastat při instance třídy sestavení přistupuje k prostředkům.


Zobrazit zdroje

Tento příklad používá dvě tlačítka zobrazit vložené prostředky. Po klepnutí na první tlačítko, bitmapovým obrazem, který je založen na prostředku, který je čten ze sestavení a zobrazeny v ovládacím prvku PictureBox formuláře. Druhé tlačítko čtení z prostředku text a zobrazí text v textovém poli.


Chcete-li zobrazit vložené prostředky, postupujte takto:
  1. Do formuláře přidáte ovládací prvek PictureBox .
  2. Přidat nové tlačítko do formuláře a potom změňte jeho vlastnost Text k Zobrazení obrazu.
  3. Poklepejte na tlačítko otevřete jeho klepněte na tlačítko událost v prohlížeči kód a vložte následující kód v této události:
       try   {
    pictureBox1.Image = new Bitmap(_imageStream); }
    catch
    {
    MessageBox.Show("Error creating image!");
    }

    Tento kód vytvoří novou instanci bitmapy, který je založen na zdroj proudu, která byla načtena v události Load formuláře.

  4. Do formuláře přidáte ovládací prvek textové pole .
  5. Přidání jiného ovládacího prvku tlačítko do formuláře a změňte její Text vlastnost Získattext.
  6. Dvakrát klikněte na tlačítko v editoru návrh otevřete Click_Event pro tlačítko a vložte následující kód v události:
       try   {
    if(_textStreamReader.Peek() != -1)
    {
    textBox1.Text = _textStreamReader.ReadLine();
    }
    }
    catch
    {
    MessageBox.Show("Error writing text!");
    }

    Tento kód určuje, zda znaky ke čtení stále existovat v datovém proudu. Pokud jsou nalezeny znaky, řádku je pro čtení textové pole.

  7. Stisknutím klávesy F5 spusťte aplikaci.

Celý kód

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

Poznámka: V aplikaci Visual Studio 2005 nebo Visual Studio 2008, je třeba změnit kód. Při vytváření projektu model Windows Forms Visual C# přidá jeden formulář projektu ve výchozím nastavení. Tento formulář je pojmenován Form1. Dva soubory, které představují formuláře jsou pojmenovány Form1.cs a Form1.designer.cs. Píšete kód v Form1.cs. Soubor Designer.cs je, kde Návrháři model Windows Forms zapíše kód, který implementuje všechny akce, můžete provést přidáním ovládacích prvků. Další informace o nástroji Designer model Windows Forms v aplikaci Visual C# 2005 nebo Visual Studio 2008 naleznete na následujícím webu společnosti Microsoft:

Poradce při potížích

Protože názvy zdrojů rozlišují velká a malá písmena, ověřte, zda používáte správný pravopis a případ prostředky, které jsou přístupné. ILDASM slouží ke čtení manifestu ověření přesného zdroje.


Odkazy

Další informace naleznete na následujících webech Microsoft Developer Network (MSDN):
Vlastnosti

ID článku: 319292 - Poslední kontrola: 16. 1. 2017 - Revize: 1

Váš názor