Transcript naslov
RP3/predavanje08
Tokovi
Atributi
Asembliji, moduli
Kompiliranje, povezivanje
17/07/2015
---------- Računarski praktikum 3 ---------Maja Starčević
1
Datoteke, direktoriji
Klase za rad s datotekama i direktorijima nalaze se u System.IO
prostoru:
File – sadrži statičke metode za rad s datotekama.
FileInfo – sve metode rade s instancama.
Directory – sadrži statičke metode za kreiranje, premještanje i
pretraživanje direktorija.
FileSystemInfo – sadrži svojstva i metode koje pružaju informacije
o datoteci ili direktoriju.
DirectoryInfo – sadrži samo instantne članove (izvedena iz klase
FileSystemInfo ).
17/07/2015
Računarski praktikum 3
2
Datoteke, direktoriji
Statičke metode u File klasi:
17/07/2015
AppendText( )
Kreira StreamWriter koji dodaje
tekst zadanoj datoteci.
Copy( )
Kopira postojeću datoteku u
novu datoteku.
Create( )
Kreira datoteku sa zadanom
stazom.
Delete( )
Briše zadanu datoteku.
Exists( )
Vraća true ako zadana datoteka
postoji.
Računarski praktikum 3
3
Datoteke, direktoriji
17/07/2015
GetAttributes( ), SetAttributes( )
Vraća i postavlja FileAttributes
za zadanu datoteku.
GetCreationTime( ),
SetCreationTime( )
Vraća/postavlja datum i vrijeme
stvaranja datoteke.
GetLastAccessTime( ),
SetLastAccessTime( )
Vraća/postavlja zadnje vrijeme
pristupa zadanoj datoteci.
GetLastWriteTime( ),
SetLastWriteTime( )
Vraća/postavlja zadnje vrijeme
pisanja u datoteku.
Move( )
Premješta datoteku na novu
lokaciju.
Računarski praktikum 3
4
Datoteke, direktoriji
17/07/2015
FileInfo
Directory
DirectoryInfo
Attributes( ), CreationTime
Directory, Exists
Exstension, FullName
LastAccessTime
LastWriteTime
Length, Name
AppendText( )
CopyTo( ), Create( )
Delete( ), MoveTo( )
Open( ), OpenRead( )
OpenText( )
OpenWrite( )
CreateDirectory( )
GetCreationTime( )
GetDirectories( )
GetLogicalDrives( )
GetFiles( )
GetParent( )
Move( )
Attributes, CreationTime
Exists, Exstension
FullName
LastAccessTime
LastWriteTime
Name, Parent, Root,
Create( )
CreateSubirectory( )
Delete( )
GetDirectories( ),
GetFiles( )
GetFileSystemInfos( )
MoveTo( ), Refresh( )
Računarski praktikum 3
5
Datoteke, direktoriji
using System.IO;
...........
DirectoryInfo dir = new DirectoryInfo(@"C:\test");
DirectoryInfo subDir1 = dir.CreateSubdirectory(“movies");
DirectoryInfo subDir2 = dir.CreateSubdirectory(“music");
DirectoryInfo subSubDir2 = subDir2.CreateSubdirectory(“mp3");
subdir2.Delete(false);
error
subdir2.Delete(true);
17/07/2015
Računarski praktikum 3
6
Datoteke, direktoriji
using System;
using System.IO;
class Program
{
static int dirCounter =1;
static int indent=-1;
static void Main(string[] args)
{
DirectoryInfo dir = new DirectoryInfo(@"C:\test");
DirectoryInfo subDir1 = dir.CreateSubdirectory("movies");
DirectoryInfo subDir2 = dir.CreateSubdirectory("music");
DirectoryInfo subSubDir11 = subDir1.CreateSubdirectory("movies0809");
DirectoryInfo subSubDir12 = subDir1.CreateSubdirectory("movies0910");
DirectoryInfo subSubDir21 = subDir2.CreateSubdirectory("music0708");
DirectoryInfo subSubDir22= subDir2.CreateSubdirectory("music0809");
DirectoryInfo subSubDir23 = subDir2.CreateSubdirectory("music0910");
17/07/2015
Računarski praktikum 3
7
Datoteke, direktoriji
Program p=new Program();
p.ExploreDirectory(dir);
}
private void ExploreDirectory(DirectoryInfo dir)
{
indent++;
for (int i = 0; i < indent; i++)
Console.Write(" ");
Console.WriteLine("[{0}] {1} [{2}]\n", indent, dir.Name, dir.LastAccessTime);
DirectoryInfo[] directories = dir.GetDirectories();
foreach (DirectoryInfo d in directories)
{
dirCounter++;
ExploreDirectory(d);
}
indent--;
}
}
17/07/2015
Računarski praktikum 3
8
Datoteke, direktoriji
using System;
using System.IO;
class Program
{
static void Main(string[] args)
{
DirectoryInfo dir=new DirectoryInfo(@"C:\test\music");
FileInfo[] filesInDir = dir.GetFiles();
foreach (FileInfo file in filesInDir)
{
Console.WriteLine(file.FullName);
}
}
}
17/07/2015
Računarski praktikum 3
9
Tekstualne datoteke
Ako datoteka sadrži samo tekst, za čitanje i pisanje mogu se
koristiti StreamReader i StreamWriter klase.
static void Main(string[] args)
{
FileInfo sourceFile = new FileInfo(@"C:\test\tekst.txt");
StreamReader reader = sourceFile.OpenText();
StreamWriter writer = new StreamWriter(@"C:\test\tekst1.txt", false);
string text;
do
{
text=reader.ReadLine();
writer.WriteLine(text);
Console.WriteLine(text);
} while (text!=null);
reader.Close();
writer.Close();
Briše sadržaj
datoteke tekst1.txt
prije upisivanja
(dodaje tekst na
postojeći u slučaju
opcije true)
}
17/07/2015
Računarski praktikum 3
10
Binarne datoteke
Ako datoteka nije tekstualna (ili nismo sigurni da je), koristi
se tok bajtova (binary file).
Za binarno čitanje potrebno je stvoriti dva Stream objekta,
jedan za čitanje, jedan za pisanje, npr.
Stream inputStream = File.OpenRead(@"C:\test\tekst.txt");
Stream outputStream = File.OpenWrite(@"C:\test\tekst1.txt);
Binarno čitanje radi pomoću buffer-a (polje bajtova).
System.IO.Stream sadrži metodu:
public abstract int Read(byte[ ] buffer, int offset, int count)
17/07/2015
Računarski praktikum 3
11
Binarne datoteke
Metoda čita niz bajtova (duljine count) iz toka i pomiče
poziciju u toku za broj pročitanih bajtova. Na izlazu iz
metode buffer sadrži pročitano polje bajtova na poziciji od
offset do offset+count-1. Metoda vraća ukupan broj bajtova
učitanih u buffer:
17/07/2015
Računarski praktikum 3
12
Binarne datoteke
class Program
{
const int SizeBuff = 1024;
static void Main(string[] args)
{
Stream inputStream = File.OpenRead(@"C:\test\tekst.txt");
Stream outputStream = File.OpenWrite(@"C:\test\tekst2.txt");
byte[] buffer = new Byte[SizeBuff];
int bytesRead;
while ((bytesRead = inputStream.Read (buffer, 0, SizeBuff))>0)
{
outputStream.Write(buffer, 0, bytesRead);
}
inputStream.Close();
outputStream.Close();
}
}
17/07/2015
Računarski praktikum 3
13
Binarne datoteke
U slučaju čitanja većih datoteka, preporučljivo je koristiti
klasu BufferedStream.
BufferedStream objekt stvara unutarnji buffer koji puni
zadani buffer sa zadanim brojem bajtova, ali na način za koji
procijeni da je najefikasniji (ponekad čitajući veće, a
ponekad manje količine bajtova).
17/07/2015
Računarski praktikum 3
14
Binarne datoteke
class Program
{
const int SizeBuff = 1024;
static void Main(string[] args)
{
Stream inputStream = File.OpenRead(@"C:\test\tekst.txt");
Stream outputStream = File.OpenWrite(@"C:\test\tekst1.txt");
byte[] buffer = new Byte[SizeBuff];
int bytesRead;
17/07/2015
Računarski praktikum 3
15
Binarne datoteke
BufferedStream bufferedInput = new BufferedStream(inputStream);
BufferedStream bufferedOutput = new BufferedStream(outputStream);
while ((bytesRead = bufferedInput.Read (buffer, 0, SizeBuff))>0)
{
bufferedOutput.Write(buffer, 0, bytesRead);
}
bufferedOutput.Flush();
bufferedInput.Close();
bufferedOutput.Close();
}
}
17/07/2015
Računarski praktikum 3
16
Atributi
.NET aplikacija sadrži kod, podatke i metapodatke.
Metapodaci su informacije o tipovima, kodu, asemblijima i sl.
koje se pohranjuju uz program.
Atributi su mehanizam za pridruživanje metapodataka.
Atribut je objekt koji predstavlja podatke koji se žele
pridružiti nekom elementu programa (ciljnom elementu
atributa).
Neki atributi su sastavni dio CLR-a ili Framework-a, ostale
stvara sam korisnik.
17/07/2015
Računarski praktikum 3
17
Atributi
Ciljni element atributa može biti asembli, klasa, konstruktor,
delegat, enumeracija, događaj, polje, sučelje, metoda,
modul, svojstvo, struktura, parametar, povratna vrijednost,
drugi atribut.
Neki atributi se mogu primijeniti na bilo koji od prethodno
navedenih elemenata programa.
Svi mogući ciljevi atributa se nalaze u enumeraciji
AttributeTargets.
17/07/2015
Računarski praktikum 3
18
Atributi
Atributi se primjenjuju tako da se stave u uglate zagrade
neposredno prije ciljnog elementa. Iznimka su asembliji kad
se pripadni atribut postavlja na početak koda (ali iza svih
using naredbi).
U slučaju da se više atributa primjenjuje na isti element,
navode se u posebnim zagradama ili odvajaju zarezom.
Primjer 1:
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile(“.\\keyFile.snk”)]
ili
[assembly: AssemblyDelaySign(false),
assembly: AssemblyKeyFile(“.\\keyFile.snk”)]
17/07/2015
Računarski praktikum 3
19
Atributi
Primjer 2:
[Serializable, Obsolete, CLSCompliant(false)]
public class ImeKlase { ... }
ili
[Serializable] [Obsolete] [CLSCompliant(false)]
public class ImeKlase { ... }
ili
[Serializable, Obsolete]
[CLSCompliant(false)]
public class ImeKlase { ... }
17/07/2015
Računarski praktikum 3
20
Atributi
Ako se navede atribut CLSCompliant, kompilator će prijaviti
upozorenje za kod koji nije u skladu s CLS-om:
[assembly: CLSCompliant(true)]
......
public class C
{
public uint Metoda( ) { … }
}
// upozorenje: uint nije CLS tip
17/07/2015
Računarski praktikum 3
21
Atributi
Primjer:
[Obsolete(“Class A is obsolete; use class B instead")]
Označava
class A
elemente
{
programa koji se
public void f() {}
više ne koriste.
}
class B
{
public void f() {}
}
class Test
{
static void Main()
{
A a = new A();
//upozorenje
a.f();
‘Class A is obsolete; use class B instead’
}
}
17/07/2015
Računarski praktikum 3
22
Atributi
Modifikator extern se koristi pri deklaraciji vanjske metode,
odnosno kod korištenja Interop-servisa pri pozivu
neupravljanog koda.
Pritom se koristi atribut DllImport.
Metoda pritom mora biti deklarirana kao statička.
17/07/2015
Računarski praktikum 3
23
Atributi
using System;
using System.Runtime.InteropServices;
class MainClass
{
[DllImport("User32.dll")]
public static extern int MessageBox(int h, string m, string c, int type);
static int Main()
{
return MessageBox(0, "using extern method", "", 0);
}
}
17/07/2015
Računarski praktikum 3
24
Atributi
Da bi se kreirao novi atribut, treba napraviti izvedenu klasu
iz klase System.Attribute.
Također treba navesti ciljne elemente atributa. Za to se
koristi atribut AttributeUsage.
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property ,
AllowMultiple = true)]
17/07/2015
Računarski praktikum 3
25
Atributi
AttributeUsage je atribut koji se primjenjuje na atribute
(meta-atribut).
Prima dva argumenta:
prvi određuje skup elemenata na koje će se moći
primijeniti atribut
drugi argument pokazuje može li se na elemente primijeniti
više atributa tog tipa
17/07/2015
Računarski praktikum 3
26
Atributi
using System;
[AttributeUsage(AttributeTargets.Class |
AttributeTargets.Constructor |
AttributeTargets.Field |
AttributeTargets.Method |
AttributeTargets.Property ,
AllowMultiple = true)]
public class BugFixAttribute : System.Attribute
{
public BugFixAttribute (int bugID, string programmer, string date)
{
this.bugID=bugID;
this.programmer=programmer;
this.date=date;
}
17/07/2015
Računarski praktikum 3
27
Atributi
public string Programmer
{
get {return Programmer;}
set {Programmer=value;}
}
public int BugID
{
get {return BugID;}
set {BugID=value;}
}
public string Comment
{
get {return Comment;}
set {Comment=value;}
}
public string Date
{
get {return Date;}
set {Date=value;}
}
private int bugID;
private string programmer, comment, date;
}
17/07/2015
Računarski praktikum 3
28
Atributi
public class Calculus
{
[BugFixAttribute(145, "Luka Lukic", "30/03/10”)]
public int Func1(int x)
{
return x + 3;
}
[BugFix(149, "Luka Lukic", "05/04/11", Comment = "Fixed error")]
public int Func2(int x)
{
return x * 5;
}
}
17/07/2015
Računarski praktikum 3
29
Atributi
public class Test
{
static int Main()
{
Calculus calc=new Calculus();
Console.Write(calc.Func1(2));
return 0;
}
}
}
17/07/2015
Računarski praktikum 3
30
Atributi
Comment je imenovani parametar. Imenovani parametri su polja
koja nisu readonly, statička ni konstantna ili su to read-write svojstva
koja su javna i nisu statička. Ostali parametri se zovu pozicijski.
Pozicijski parametri se navode prije imenovanih. Imenovani se mogu
navesti u bilo kojem poretku. Za takve parametre nije potrebno
specificirati vrijednosti.
17/07/2015
Računarski praktikum 3
31
Atributi
Prethodni atribut ne utječe na output,
nema greške ni upozorenja,
već su dodani metapodaci
(mogu se vidjeti pomoću
Ildasm.exe)
17/07/2015
Računarski praktikum 3
32
Asembliji
Asembliji su CLI logičke jedinice funkcionalnosti, tj. osnovni
blokovi jedne .NET Framework aplikacije.
Primjer: pri stvaranju jednostavne C# aplikacije Visual
Studio kreira asembli u obliku jedne PE (Portable
Executable) datoteke (preciznije .dll ili .exe).
Asembli je osnovna jedinica pri učitavanju aplikacije učitavaju se samo asembliji koji su potrebni.
17/07/2015
Računarski praktikum 3
33
Asembliji
Asembliji se mogu sastojati od jedne ili više datoteka. Svaka
od tih datoteka može biti .dll ili .exe datoteka, modul,
resursna datoteka ili datoteka s manifestom.
PE datoteka može sadržavati manifest, tipske metapodatke,
IL kod i /ili resurse.
U asembliju koji se sastoji od jedne datoteke (.dll ili .exe)
manifest je uključen u tu datoteku. Kod asemblija s više PE
datoteka, manifest može biti u posebnoj datoteci ili uključen
u jednu od PE datoteka.
17/07/2015
Računarski praktikum 3
34
Asembliji
Postoje dva tipa asemblija
Procesni asembliji (.exe)
Biblioteke (Library) (.dll)
Svaki asembli može imati samo jednu ulaznu točku (Main,
DllMain ili WinMain).
17/07/2015
Računarski praktikum 3
35
Asembliji
Asembliji sadrže djelomično kompiliran kod (IL upravljani
kod) koji će CLR JIT tijekom izvršavanja prevesti u matični
strojni kod.
Asembli sadrži informacije koje su potrebne izvršnoj okolini
da bi pronašla, učitala i izvršila aplikaciju.
IL kod neće biti izvršen ako pripadni asembli koji je učitan
nema pridružen manifest.
17/07/2015
Računarski praktikum 3
36
Asembliji
Statički asembli može sadržavati četiri osnovna dijela. To
su:
Manifest koji sadrži metapodatke asemblija
Tipski metapodaci
MSIL (IL) kod koji implementira te tipove.
Skup resursa
Jedini nužan dio je manifest.
17/07/2015
Računarski praktikum 3
37
Asembliji
Grupiranje elemenata u asembliju se može napraviti na više
načina, tj. pomoću jedne ili više datoteka.
Primjer (asembliji sa samo jednom datotekom (.dll ili .exe)):
Manifest
Manifest
Tipski metapodaci
Tipski metapodaci
IL kod
ili
IL kod
Resursi
asembli.exe
17/07/2015
asembli.dll
Računarski praktikum 3
38
Asembliji
Resursi
FILE2:
pictures.recources
Manifest
Tipski metapodaci
IL kod
Resursi
Tipski metapodaci
IL kod
FILE1:asembli.exe
FILE3:
modul.netmodule
Assembly 1
17/07/2015
Računarski praktikum 3
39
Asembliji
Za file system, datoteke koje čine asembli s više datoteka
nisu fizički povezane. One su povezane preko manifesta
asemblija koji ih sadrži. Zbog manifesta CLR ih tretira kao
cjelinu.
Kroz manifest asemblija ostvaruje se veza s modulima,
resursima i ostalim datotekama asemblija.
Statički asembliji pohranjuju se na disk u PE formatu.
Dinamički asembliji se ne pohranjuju na disk prije
izvršavanja, ali se mogu spremiti nakon izvršavanja.
17/07/2015
Računarski praktikum 3
40
Opcije kompiliranja
Kako napraviti biblioteku klasa:
Visual Studio:
Project -- >project’s Properties -- >Application
Output type property:
Windows Application
Console Application
Class Library
17/07/2015
Računarski praktikum 3
41
Opcije kompiliranja
csc /target:library myCode.cs
csc /out:myCodeLibrary.dll /t:library myCode.cs
Opcija /target:exe koristi se za kreiranje konzolne aplikacije.
Ako nije drugačije specificirano s /out opcijom, izlazna datoteka
dobiva ime po ulaznoj datoteci koja sadrži Main metodu.
Za stvaranje .exe datoteke potrebna je točno jedna Main metoda
u ulaznom kodu. Ako postoji više klasa s Main metodom, koristi
se opcija /main za raspoznavanje “prave” Main metode.
17/07/2015
Računarski praktikum 3
42
Opcije kompiliranja
Ulazna točka u .exe mora imati ime Main.
Sljedeće implementacije su dozvoljene:
static void Main() { }
static void Main(string[] args) { }
static int Main() { return 0; }
static int Main(string[] args) { return 0; }
17/07/2015
Računarski praktikum 3
43
Ime asemblija
Ime asemblija sastoji se od četiri dijela:
Kratko ime – odgovara nazivu PE filea (bez ekstenzije).
Kultura - biblioteke i procesni asembliji u pravilu nemaju
kulturu. Navodi se samo za satelitske asemblije. (Primjer:
"MS_409“ za American English.)
Verzija – dotirani broj s četiri vrijednosti ( major, minor,
build, revision).
Javni ključ - za asembli s potpisom se kaže da ima strogo
ime (strong name).
17/07/2015
Računarski praktikum 3
44
Manifest
Manifest se može nalaziti u vlastitoj PE datoteci ili u glavnoj
datoteci (.dll ili .exe) s drugim elementima asemblija.
Manifest sadrži sljedeće podatke o asembliju:
17/07/2015
Culture
lokalizacijska informacija (samo za
satelitske asemblije)
Files
popis datoteka u asembliju
Name
ime asemblija
References
referirani asembliji
Strong Name
informacija javnog ključa
Types
popis tipova u asembliju
Version
broj verzije asemblija
Računarski praktikum 3
45
Asembliji
Svi asembliji sadrže manifest.
Manifest
File1.dll
File2.dll
Graphic.jpg
Logo.bmp
Manifest
Assembly 2
17/07/2015
Assembly 3
Računarski praktikum 3
46
Ime asemblija
Javni ključ služi tome da ime asemblija bude jedinstveno.
Dva asemblija sa strogim imenom mogu imati isto PE ime,
ali ih .NET prepoznaje kao dva različita asemblija.
Windows file system (FAT32 i NTFS) prepoznaje samo ime
PE datoteke, tako da dva asemblija s istim nazivom PE
datoteke (ali različitom kulturom, verzijom ili javnim ključem)
ne mogu koegzistirati u istom Windows direktoriju.
Da bi se riješio taj problem .NET uvodi GAC (Global
Assembly Cache) kojeg .NET CLR tretira kao direktorij, ali
se u biti radi o ugniježdenim NTFS1 ili FAT32 direktorijima.
17/07/2015
Računarski praktikum 3
47
GAC
Kad se asembliji žele dijeliti između aplikacija, stavljaju se u
Global Assembly Cache.
Da bi se asembli smjestio u GAC mora imati strogo ime.
Asembli mora imati datoteku s istim imenom kao i asembli.
Asembli se može smjestiti u GAC pomoću Microsoft
Windows Installer ili Gacutil.exe.
Primjer: instaliranje asemblija hello.dll u GAC:
gacutil -i hello.dll
17/07/2015
Računarski praktikum 3
48
Ime asemblija
U Visual Studiu default ime projekta podudara se s default
imenom asemblija. Inače, nisu u vezi. Promjena imena
projekta ne mijenja ime asemblija.
Asembli sa strogim imenom može koristiti samo tipove iz
istog takvog asemblija (inače postoji sigurnosni problem).
17/07/2015
Računarski praktikum 3
49
Ime asemblija
Da bi se asembliju dodijelilo strogo ime, potrebno je stvoriti
javno-privatni par ključeva. Radi se o kriptografskim
ključevima koji se koriste tijekom kompiliranja.
Za generiranje ključa koristi se Strong Name Tool (Sn.exe).
Dobiva se datoteka sa .snk ekstenzijom.
Primjer: Naredba
sn -k keypair.snk
stvara par ključeva.
17/07/2015
Računarski praktikum 3
50
Ime asemblija
S druge strane
sn -p keypair.snk public.snk
izdvaja javni ključ iz tog para i kopira ga u zasebnu datoteku.
Ključ se dodaje asembliju pomoću atributa
[AssemblyKeyFileAttribute(@"..\..\key.snk")]
ili npr. za vrijeme povezivanja
al /out:MyAssembly.dll MyModule.netmodule /keyfile:sgKey.snk
17/07/2015
Računarski praktikum 3
51
Verzioniranje
Asembliji kod .NET aplikacija imaju ulogu i u rješavanju
problema verzioniranja koje imaju neki drugi tipovi aplikacija
(npr. samo jedna verzija aplikacije može biti instalirana na
računalu i samo jedna se može izvršavati u određenom
trenutku, problemi pri deinstaliranju, problemi s registrom).
Asembli je najmanja jedinica za verzioniranje u .NET
aplikaciji. Svi tipovi i resursi u istom asembliju verzioniraju se
kao cjelina.
Verzioniranje se radi samo na asemblijima koji imaju strogo
ime.
17/07/2015
Računarski praktikum 3
52
Verzioniranje
Cijelo verzioniranje asemblija se radi na razini asemblija.
Postoje dva tipa verzije za asembli:
Broj verzije asemblija (bitan kod izvršavanja)
Informacijska verzija - string koji predstavlja dodatnu
informaciju o verziji (samo za informativnu svrhu, ne
koristi se pri izvršavanju)
17/07/2015
Računarski praktikum 3
53
Verzioniranje
Primjeri:
Broj verzije: 2.0.1813.0
revision
major version
build number
minor version
Informacijska verzija: “Common Language Runtime version 1.0"
17/07/2015
Računarski praktikum 3
54
Metapodaci
Metapodaci su Microsoftovo rješenje za probleme s
registrom (registarski unosi, dijeljene biblioteke).
Pod .NET platformom programi se kompiliraju u PE
datoteke. Zaglavlje takve datoteke sadrži metapodatke.
Metapodaci sadrže opis svakog sučelja, metode, klase,
imeničkog prostora, ... u PE fileu.
Kroz metapodatke se mogu npr. otkriti sve klase i njihovi
članovi u PE fileu.
17/07/2015
Računarski praktikum 3
55
Metapodaci
Metapodaci su smješteni u jedan dio PE datoteke. Taj dio
sadrži niz tablica i struktura podataka tipa heap. Npr. jedna
tablica opisuje sve klase u kodu (koliko klasa, toliko redaka).
Tablice se također referiraju na druge tablice (npr. klase na
metode).
Heap strukture su string, blob, user string i GUID (npr. imena
metoda se nalaze na heapu string).
IL kod je smješten u poseban dio te datoteke i sadrži
metadata tokene (konceptualno slične pokazivačima) koji
referiraju na prvi dio datoteke. Da bi se vidjeli ti podaci,
može se koristiti MSIL Disassembler (Ildasm.exe).
17/07/2015
Računarski praktikum 3
56
Moduli
Važne, osnovne, odnosno uobičajeno korištene klase čine
dio glavne datoteke dok se rijetko korištene klase stavljaju u
module. Moduli se dodaju i kad postoje dijelovi koda pisani u
različitim programskim jezicima.
Osnovna razlika između asemblija i modula ---> asembli
sadrži manifest za razliku od modula.
S druge strane, i asembliji i moduli sadrže metapodatke koji
ih opisuju.
Modul može sadržavati više imenskih prostora od kojih se
svaki može protezati na više modula.
17/07/2015
Računarski praktikum 3
57
Moduli
Moduli su također PE datoteke, ali s ekstenzijom
.netmodule. Da bi se modul mogao koristiti potrebno je
stvoriti PE datoteku s manifestom asemblija.
Modul se iz koda stvara kompliranjem s opcijom /t:module.
Dva su načina kako uključiti modul u asembli:
Pomoću opcije /addmodule modul se dodaje asembliju.
Direktno, preko /t:exe, /t:winexe ili /t:library modul se
konvertira u asembli.
Napomena: Pokušaj dodavanja reference na modul (s
opcijom /:reference) vraća grešku.
17/07/2015
Računarski praktikum 3
58
Moduli
using System;
namespace Modul
{
public class Klasa
{
public void Metoda()
{
Console.WriteLine(“Kod iz modula.");
}
}
}
17/07/2015
Kod spremimo
u modul.cs
csc /t:module modul.cs
module.netmodule
csc /t:library modul.cs
modul.dll
Računarski praktikum 3
59
Moduli
using System;
using Modul;
class Program
{
public static void Main()
{
Klasa k = new Klasa();
Console.WriteLine(“Ovaj kod je iz glavne datoteke.");
k.Metoda();
Kod spremimo
u program.cs
program.exe
}
}
Output:
csc /addmodule:modul.netmodule program.cs
17/07/2015
Računarski praktikum 3
Ovaj kod je iz glavne datoteke.
Kod iz modula.
60
Moduli
Isti efekt se postiže i jednom naredbom
csc /out:program.exe program.cs /out:modul.netmodule modul.cs
csc /r:modul.dll program.cs
ili
program.exe
Modul.dll nije modul, već biblioteka i pripada drugom asembliju.
Ako klasi Klasa (namespace Modul) ispustimo modifikator public,
postaje dostupna samo unutar asemblija modul.dll. Javlja se
greška pri kompiliranju.
17/07/2015
Računarski praktikum 3
61
Assembly linker
Assembly Linker generira datoteku s asembli manifestom iz
jedne ili više datoteka koje su ili moduli ili resursi. Modul je
IL datoteka koji nema manifest o asembliju.
Ako imamo jedan ili više modula, koristimo al.exe da bi
kreirali asembli s manifestom u posebnoj datoteci.
Primjer (direktno konvertiranje modula u asembli (stvaranje
manifesta)):
al modul.netmodule /t:dll /out:modul.dll
17/07/2015
Računarski praktikum 3
62
Assembly linker
Kako napraviti asembli s više datoteka (modula):
Prvo se kompiliraju sve datoteke koje sadrže imenske
prostore na koje postoje reference. Kompiliranjem se
dobivaju moduli (.netmodule).
Zatim se kompiliraju druge datoteke u module i pritom se
obavezno navodi opcija koja pokazuje na koje već
generirane module se kod referira.
U zadnjem koraku koristi se Al.exe za stvaranje asemblija
s manifestom koji će sadržavati sve informacije o
modulima.
17/07/2015
Računarski praktikum 3
63
Assembly linker
csc /t:module modul.cs
modul.netmodule
csc /addmodule:modul.netmodule /t:module program.cs
program.netmodule
al program.netmodule modul.netmodule
/main:Program /out:program.exe /t:exe
program.exe
17/07/2015
Računarski praktikum 3
64
Resursi
Gotovo svaka veća aplikacija mora koristiti resurse.
Resursi sadržavaju podatke u različitim formama (stringovi,
slike, ikone, audio datoteke ...).
Radi se o neizvršnim datotekama.
17/07/2015
Računarski praktikum 3
65
Resursi
Primjer:
Stream s = File.OpenRead(@"C:\test\slika1.jpg");
U ovom dijelu koda slika slika1.jpg ne mora biti uključena u asembli
pa nije sigurno postoji li uopće na disku, čak i ako je distribuirana
zajedno s aplikacijom.
Rješenje problema --- > uključiti sliku u resurse.
17/07/2015
Računarski praktikum 3
66
Resursi
Datoteku slika1.jpg pretvaramo u resurs pomoću
opcije /resource.
csc program.cs /resource:C:\test\slika1.jpg
Podaci u resursnoj datoteci smješteni su u manifest:
17/07/2015
Računarski praktikum 3
67
Resursi
U sljedećem kodu slika1.jpg se poziva iz resursa asemblija:
using System;
using System.IO;
using System.Reflection;
class Program
{
public static void Main()
{
Program p=new Program();
Assembly a =p.GetType().Assembly;
Stream s = a.GetManifestResourceStream("slika1.jpg");
}
}
17/07/2015
Računarski praktikum 3
68
Resursi
Visual Studio poziva resgen.exe za konvertiranje
aplikacijskih resursa u internal klasu Resources.
Klasa je smještena u Resources.Designer.cs file
Resources klasa enkapsulira resurse projekta pomoću
statičkih readonly get svojstava.
System.Drawing.Bitmap bitmap1 = Resources.Image01;
17/07/2015
Računarski praktikum 3
69
Satelitski asembliji
Resursi aplikacije mogu se razmjestiti u satelitske asemblije
koji po definiciji i mogu samo sadržavati resurse, dakle
nemaju kod.
Za svaku kulturu se kreira poseban satelitski asembli koji
nije dio glavnog asemblija pa se lako mogu mijenjati podaci
bez utjecaja na glavni asembli.
Default resursi se smještaju u glavni asembli pa promjene
default podataka utječu na taj asembli.
17/07/2015
Računarski praktikum 3
70
Friend asembli
Asembli dopušta friend asembliju pristup svojim internal
članovima. S druge strane, privatni članovi ostaju
nepristupačni.
Da bi se asembliju B dao pristup internal članovima
asemblija A koristi se InternalsVisibleToAttribute atribut u
asembliju A.
[assembly:InternalsVisibleToAttribute("AssemblyB,
PublicKey=32ab4ba45e0a69a1")]
17/07/2015
Računarski praktikum 3
71
protected internal
namespace library1
{
public class C
{
Kod kompiliran u
asembli library1.dll
protected internal virtual void f()
{
Console.WriteLine(“f iz library 1");
}
}
public class D
{
void g()
{
C obj=new C();
obj.f();
}
}
}
17/07/2015
Računarski praktikum 3
72
protected internal
namespace library2
{
public class E : C
{
Kod kompiliran u
asembli library2.dll
(s referencom na
library1.dll)
protected override void f()
{
Console.WriteLine(“f iz library 2");
}
}
}
17/07/2015
Računarski praktikum 3
73
XML
17/07/2015
Računarski praktikum 3
74
XML
using System;
using System.Xml
class Program
{
private static void Citaj()
{
XmlDocument xd = new XmlDocument();
xd.Load(@"D:\test.xml");
XmlNodeList list = xd.GetElementsByTagName("album");
foreach (XmlElement item in list)
{
Console.WriteLine(item.ChildNodes[0].InnerText);
Console.WriteLine(item.ChildNodes[1].InnerText);
}
}
17/07/2015
Računarski praktikum 3
75
XML
public static void Spremi()
{
XmlDocument xd = new XmlDocument();
xd.AppendChild(xd.CreateXmlDeclaration("1.0", "", ""));
XmlElement root = xd.CreateElement("kolekcija");
xd.AppendChild(root);
XmlElement element = xd.CreateElement("album");
root.AppendChild(element);
element.AppendChild(xd.CreateElement("naslov"));
element.AppendChild(xd.CreateElement("izvodjac"));
element.ChildNodes[0].InnerText = "Let it be";
element.ChildNodes[1].InnerText = "Beatles";
xd.Save(@"D:\test.xml");
}
17/07/2015
Računarski praktikum 3
76
XML
static void Main(string[] args)
{
Spremi();
Citaj();
}
}
17/07/2015
Računarski praktikum 3
77