Resurse gestionate în fișiere executabile

Va fi creat fișierul MyStrings.resources, care poate fi inclus în proiect.

Adăugarea resurselor la VS.NET

Într-un sens, cel mai simplu tip de resursă este un fișier ca atare, ca unitate de stocare, iar tipul fișierului nu contează. Acesta poate fi un fișier cu o imagine, cu unele informații codificate și așa mai departe ... Adăugarea conținutului unui fișier la o resursă este probabil cea mai ușoară cale de a adăuga resurse într-un fișier executabil. Să vedem cum se poate face acest lucru.







Să presupunem că un fișier numit Bitmap1.bmp care conține o imagine este deja scris pe hard disk (numele fișierului și natura informațiilor din el pot fi oricare). Pentru a adăuga conținutul fișierului Bitmap1.bmp la executabil ca resursă, trebuie să faceți următoarele:

În fereastra Solution Explorer, selectați elementul care corespunde proiectului dezvoltat, apoi faceți clic pe butonul din dreapta al mouse-ului.

În meniul pop-up care apare, selectați elementul "Adăugați", apoi selectați elementul "Adăugați elementul existent" din următorul meniu pop-up.

În caseta de dialog care apare, selectați fișierul pe care doriți să-l adăugați la proiect.

După executarea tuturor acestor acțiuni, fișierul apare în arborele proiectului (vezi Figura 1):

În meniul contextual al fișierului adăugat, selectați elementul "Proprietăți", care la rândul său va duce la fereastra "Proprietăți", în care va fi posibilă modificarea proprietăților fișierului.

Selectați proprietatea "Resursă încorporată" din proprietatea "Construiește acțiune" (a se vedea Figura 2):

După aceste acțiuni și compilare, conținutul fișierului Bitmap1.bmp va fi inclus în resurse. În acest fel, orice (în limite rezonabile, desigur) numărul de fișiere poate fi inclus în resursă. Este clar că nu se vor întreprinde acțiuni cu conținutul fișierului, o copie a conținutului fișierului va apărea în secțiunea resurse gestionate.

După cum am menționat deja, resursele formatelor .resources pot fi adăugate la resurse. Pentru aceasta, efectuați următoarele acțiuni:

Ca urmare a acestor acțiuni, Visual Studio va crea un fișier XML, o parte din conținutul căruia poate fi văzut în Figura 4.

Acest fișier va avea o extensie .resx, iar atunci când proiectul este compilat, conținutul său va fi convertit în .resources și inclus în executabil.

Din păcate, folosind grid'a (a se vedea. Figura 3) Visual Studio .NET adăuga date .resx nu sunt tipuri primitive, cum ar fi o imagine, este practic imposibil, se poate face numai de resursele de date serializare.







Mai ales este necesar să se spună despre fișierele .resx care conțin date despre formularele create de Form Designer. Desigur, acestea conțin și resurse. Dar! Aceste fișiere sunt generate automat. Prin urmare, în cazul general, când adăugați date la aceste fișiere atunci când recompilați proiectul, aceste date vor fi pierdute.

Utilizarea resurselor în aplicație

Este clar că resursele sunt create pentru a extrage ulterior date de la acestea. Resursele sunt accesate folosind metoda GetManifestResourceStream. De exemplu, pentru a accesa resursele Bitmap1.bmp adăugate anterior, puteți utiliza următoarea secvență de operatori:

Este evident că formatul .resource a fost creat cu speranța că datele din acesta vor fi citite element-cu-element, iar căutarea unei resurse separate în acest format va fi făcută prin numele acestei resurse. Pentru a accesa resursele, puteți utiliza metodele din clasa ResourceManager. Cele două metode principale, GetString și GetObject, sunt destinate să se încarce din resursele șirurilor și, respectiv, obiectelor. Mai jos este un exemplu de utilizare a unui obiect ResourceManager pentru a încărca o linie adăugată anterior în .resources:

Această metodă returnează nu doar un set de octeți, ci o instanță a clasei System.String. Metoda GetObject găsește o resursă element cu numele specificat, creează o nouă instanță a obiectului și încarcă starea obiectului (folosind BinaryFormatter) în ea. Astfel, putem spune că metodele ResourceManager încarcă obiecte din resurse cu ajutorul unor nume logice. După cum sa menționat mai devreme, acest mecanism a fost destinat în principal încărcării stării componentelor și a conținutului lor în designeri, cum ar fi Windows Forms și ASP.NET. În mod implicit, designerii încearcă să serializeze starea componentelor din cod, dar există momente în care serializarea în cod este imposibilă. De exemplu, este dificil (și nerezonabil) să se serializeze conținutul imaginilor în cod. În plus față de proiectantul ar putea serializam complet în codul toate proprietățile unei componente, dezvoltatorul componentei trebuie să ia unele măsuri (puse în aplicare TypeConverter, care transformă o instanță a unei construcții descriere clasa instanță - InstanceDescriptor). Dacă nu există nici una și clasa serializabilă nu este o componentă, proiectantul va încerca să serializeze starea instanței cu BinaryFormatter. Dacă reușește, va scrie această stare într-un fișier .resx, iar în cod se va apela metoda ResourceManager.GetObject. Resurselor i se va da un nume de tip Name. De exemplu, componenta pictureBox1 (de tip System.Windows.Forms.PictureBox) are o proprietate Image de tipul System.Drawing.Image. Acest tip nu acceptă serializarea codului, dar nu este într-adevăr necesar, deoarece conținutul său principal este o imagine. Prin urmare, designerii serializează obiecte de acest tip în resurse (fișiere .resx). După compilație, fișierele .resx sunt convertite în resurse ale formatelor .resources cu nume care corespund numelor formularelor formularului SpaceName Accepted Default. Numele formularelor. La începutul metodei InitializeComponent a formularului corespunzător, se adaugă codul care inițializează instanța ResourceManager:

iar partea codului de inițializare a componentei (în cazul nostru, pictureBox1) este adăugată la codul de încărcare al obiectului din resursă:







Trimiteți-le prietenilor: