[ twister @ 16.06.2003. 22:12 ] @
Napravio sam svoj dll i u postojeci projekat ga dodao sa add reference...
I dok je dll tu, sve radi... ali kada obrisem dll i pokrenem program iz windowsa (ne VS-a), program puca kada pokusa da pozove metodu iz pomenutog dll-a. Try catch ne hvata ovaj exception, vec se javlja VS-ov debugger sa unhandled exception itd...
[ Reljam @ 16.06.2003. 22:29 ] @
Tako je, to je by design. U cemu je konkretno problem?
[ Dragi Tata @ 16.06.2003. 22:49 ] @
Pa šta si očekivao da se desi?
[ twister @ 17.06.2003. 03:38 ] @
ocekivao sam da sledeci kod uhvati exception:

try
{
MojaKlasaIzDLLa.StatickaMetoda(); //ne mora staticka, bilo sta
}
catch
{
///blablabla
}

e problem je ako ne postoji taj dll, program puca a ne ulazi u catch blok. A glupo je da pisem funkciju koja ce da proba da nadje u direktorijumu i global cache-u (ili gde vec), dll koji ce program da koristi. Jednostavno, zasto try/catch ne hvata ovaj vid exceptiona? I kako to da resim osim na pomenuti nacin?
[ Dragi Tata @ 17.06.2003. 18:13 ] @
Ako si taj dll (neka .NET komponenta, pretpostavljam) dodao u projekat sa Add reference, onda je se on učitava čim program startuje i ako ga nema, program puca. Nikad i ne stigne do tog tvog try-catch bloka. Naravno, postoji i mogućnost dinamičkog učitavanja, ali to je malo komplikovanije.
[ twister @ 17.06.2003. 19:01 ] @
Ne puca. Upravo sam ponovo otkucao kod i evo kako stvari stoje:

u dll projektu je klasa koja nema nista osim praznog konstruktora.
u aplikaciji je uradjen add reference na ovaj dll.
u aplikaciji na dugme btn1 samo kreiram klasu sa
mojaklasa tmp = new mojaklasa();
naravno, okolo je i try/catch kod iz prethodne poruke i to je sav kod.
izadjem iz devenv-a, odem u bin direktorijum aplikacije, obrisem *.pdb i *.dll tako da ostane samo mojaapp.exe
pokrenem mojaapp.exe i TEK KADA KLIKNEM na dugme btn1 iskace prozor sa exception-om! A try/catch ga NE HVATA!

izgleda da mi ostaje samo da dinamicki ucitam dll samo da bi proverio da li postoji.
[ havramm @ 21.06.2003. 01:22 ] @
Citat:
Dragi Tata: Ako si taj dll (neka .NET komponenta, pretpostavljam) dodao u projekat sa Add reference, onda je se on učitava čim program startuje i ako ga nema, program puca.

Kao sto je twister zakljucio, ovo nije tacno, a zbog cega:
Citat:
Kada se neka metoda pozove po prvi put, CLR otkriva koje tipove metoda referencira. ... CLR ucitava datoteku referenciranog sklopa samo onda kada se pozove metoda koja referencira tip iz tog sklopa. To znaci da se za pokretanje neke aplikacije, ne zahteva prisustvo svih referenciranih skopova.
Jeffrey Richter, Applied Microsoft .NET Framework Programming, MSPress, 2002


Sto se tice toga sto ne uspevas da uhvatis exception, pretpostavljam da windows forms okruzenje (Application ili nesto slicno...) hvata izuzetke najviseg nivoa (znaci klasu Exception, prakticno unhandled exception, mada...) ne dopustajuci da to uradi sama aplikacija. Ovo samo pretpostavljam, nisam siguran. Ako neko tacno zna sta se desava, bio bih mu zahvalan ako bi to podelio sa ostalima.

Pozdrav
[ Dragi Tata @ 23.06.2003. 19:56 ] @
Hehehe, mislim da sam provalio u čemu je stvar. Taj izuzetak nije bačen kad pozoveš funkciju sa MojaKlasaIzDLLa.StatickaMetoda(); već pre toga - odmah po pozivu funkcije OnClick. Naime, ako pogledate onaj citat koji je ostavio havramm, lepo kaže:

Citat:
CLR ucitava datoteku referenciranog sklopa samo onda kada se pozove metoda koja referencira tip iz tog sklopa


Dakle, dll se učitava kad se pozove metoda koja koristi tip iz tog dll-a, a ne kad se pozove prva metoda iz tog tipa. Izuzetak je bio bačen odmah po pozivu OnClick metoda i nikad se nije ni stiglo do try-catch bloka.
[ havramm @ 24.06.2003. 00:18 ] @
Svaka cast!