HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Alkalmazások beágyazott erőforrásainak felhasználása


Példaprogram letöltése

18482 bájt

A .NET Framework szolgáltatásai közül talán legfontosabb az assembly-orientált szerveződés, mely lehetővé teszi a CLR számára, hogy a felügyelete alatt futó kódról az információkat összefogva, önleíró módon tárolja. Ezek reprezentációja a System.Reflection névtér Assembly osztálya, melynek néhány metódusát mostani cikkünkben közelebbről is megismerjük, mint az erőforrások kinyerésének eszközeit.

Assembly-elv
A .NET-keretrendszer a .NET-kód, az erőforrások, és a metaadatok tárolására széles körben alkalmazza az assembly-ket. A .NET-futtatórendszer csak az assembly-ben tárolt kódot hajtja végre. Ezen felül minden biztonsági funkció, névtér-feloldás és verziókezelés az assembly-k szintjén valósul meg.
Az assembly az alkalmazás kódját és erőforrásait tartalmazó EXE- vagy DLL-fájl(ok) logikai gyűjteménye. Az assembly önleíró adatokat, ún. manifesztet is tartalmaz, amely az assembly-ben található kód és erőforrások leírása, metaadatok formájában.
Bár az assembly gyakran egy fájlban található, nem ritka eset, hogy az assembly több, azonos könyvtárban található fájl logikai (nem fizikai) gyűjteménye. Az assembly-t alkotó fájlokat leíró manifeszt vagy az assembly egyik EXE- vagy DLL-állományában található, vagy pedig maga külön, önmagában alkot egy EXE- vagy DLL-fájlt. Ha többfájlos assembly-vel van dolgunk, mindig szem előtt kel tartanunk, hogy a fájlokat a fájlrendszer semmilyen módon sem köti össze. Kizárólag a mi dolgunk, hogy a manifeszben megjelölt fájlokat elérhetővé tegyük a programbetöltő számára. Csupán attól részei az assembly-nek, hogy szerepelnek a manifeszt-ben.
Windows-os alkalmazásaink többféleképpen tárolhatják erőforrásaikat.
  • Ezek legáltalánosabb formája, amikor az alkalmazás Form-ja az alkalmazás mappájában létrehozott, Form-mal megegyező nevű .resx állományban tárolja az összes általa használt erőforrást. Ez az adott Form magánügye, kezelése nem a programozó dolga.
  • Másik formája, amikor az erőforrás állományát hozzáadjuk az alkalmazás projectjéhez, és az erőforrás Properties lapján beállítjuk a Build Action property-t Embedded Resource értékre. Ehhez az erőforráshoz fejlesztőként hozzáférhetünk, manipulálhatjuk, máshol felhasználhatjuk. Ezen műveletek végrehajtása az Assembly osztály metódusaival lehetséges, melyek a következők:
LoadFrom
Osztály: Assembly
public static Assembly LoadFrom(
string assemblyFile
);
A statikus metódus lehetővé teszi, hogy a paraméterben megadott .EXE, vagy .DLL állományból betöltsük az adott alkalmazás manifeszt-jét egy Assembly objektumba.
Paraméterek
string assemblyFile
Az alkalmazás manifeszt-jét tároló fájl elérési útja.
Visszatérési érték
A betöltött Assembly objektum.
GetManifestResourceNames
Osztály: Assembly
public virtual string[] GetManifestResourceNames();
A rendelkezésre álló manifeszt-ből betölti az összes beágyazott erőforrás nevét egy string tömbbe.
Visszatérési érték
A string tömb a nevekkel.
GetManifestResourceStream
Osztály: Assembly
public virtual Stream GetManifestResourceStream(
string name
);
Betölti egy Stream objektumba a rendelkezésre álló manifeszt erőforrását a paraméterben megadott név alapján.
Paraméterek
string name
Az erőforrás neve minősített névvel, például assemblynév.erőforrásnév.
Visszatérési érték
Az erőforrás adatfolyama.
ResourceSample alkalmazás
A mellékelt alkalmazás-csomag két projectet tartalmaz. A ResourceSample alkalmazás tartalmaz két kép erőforrást a programba ágyazva.
Az alkalmazás From-ján két gomb található, melyekkel a beágyazott erőforrások – img1.jpg és img2.jpg az alkalmazás mappájában – felváltva betölthetők.


Az egyes erőforrások Build Action property-je tehát Embedded Resource értéket vesz fel, melyet magunk állítunk be, jelezve a CLR-nek az elem speciális rendeltetését.


Az alkalmazás manifeszt-jét a megvizsgálva látható, hogy a két erőforrás kapott egy-egy bejegyzést. Az alkalmazás manifeszt-jét a .NET Framework %winroot%:/Program Files/Microsoft Visual Studio.NET/FrameworkSDK/Bin/ildasm.exe elérési útvonalon megtalálható programjával vizsgálhatjuk meg.


GetAppResource alkalmazás
Az alkalmazás Form-ján található gombokkal betölthető egy másik program, vagy kontrol kódját hordozó .DLL, vagy .EXE állomány beágyazott erőforrása, majd elmenthető egy tetszőleges helyen és névvel a merevlemezen. Az erőforrások nevét tárolja a Form-on található ListBox kontrol betöltés után. Az erőforrás, amennyiben az megjeleníthető egy PictureBox kontrolban, megjelenik egy, a Form-ra helyezett vezérlőben.
Az állományok keresését és mentését egy-egy OpenFileDialog és SaveFileDlg komponens segíti. Az ’Erőforrás betöltése’ feliratú gombbal az említett LoadFrom metódussal betöltjük az erőforrásokat, majd megjelenítjük minősített nevüket a listában a GetManifestResourceNames metódussal:
loadedAssembly = Assembly.LoadFrom(openDlg.FileName);
...
string [] resourceNames = loadedAssembly.GetManifestResourceNames();
lb.Items.Clear();
if( resourceNames.Length > 0 )
{
  lb.BeginUpdate();
  foreach(string resourceName in resourceNames)
  {
    lb.Items.Add(resourceName);
  }
  lb.EndUpdate();
}
...
A lista kijelölésének megváltozásakor frissül a kép a PictureBox kontrolban. Ehhez felhasználtuk a GetManifestResourceStream metódust:
private void lb_SelectedIndexChanged(object sender, System.EventArgs e)
{
  int res = 0;
  if( lb.SelectedIndex < 0 )
    return ;
  Stream stream = null;
  try
  {
    stream = loadedAssembly.GetManifestResourceStream((string) lb.SelectedItem);
    Image Image = Image.FromStream(stream);
    Image oldImage = pb.Image;
    pb.Image = Image;
    ...
  }
  ...
Az erőforrás elmentéséhez szintén szükséges a GetManifestResourceStream metódus, hogy megkapjuk az erőforrás adatfolyamát a név alapján:
private void saveButton_Click(object sender, System.EventArgs e)
{
  saveDlg.FileName = (string) lb.SelectedItem;
  if( lb.SelectedIndex < 0 || saveDlg.ShowDialog() == DialogResult.Cancel)
    return ;
  Stream outFile = saveDlg.OpenFile();
  Stream inFile = loadedAssembly.GetManifestResourceStream((string) lb.SelectedItem);
  long length = inFile.Length;
  ...
  byte [] bytes = new byte[length];
  inFile.Read( bytes, 0, (int) length );
  outFile.Write( bytes, 0, (int) length );
  inFile.Close();
  outFile.Close();
}
Az inFile Stream objektum beolvassa az Assembly-ben tárolt erőforrás bájtjait egy tömbbe, melyet az outFile objektum ír ki egy állományba a megadott néven, mely alapértelmezésben az erőforrás minősített neve és eredeti, a „szerver” alkalmazásban beágyazott erőforrás kiterjesztése.

Cikksorozat

#IDKategóriaCikk címeSorozat
1621DelphiMySQL szerverek elérése Delphi-ből1. rész
1632DelphiMySQL szerverek elérése Delphi-ből2. rész
1641DelphiMySQL szerverek elérése Delphi-ből3. rész
1649DelphiMySQL szerverek elérése Delphi-ből4. rész


Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 13. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |