[ bags @ 15.04.2008. 11:23 ] @
| Problem:
Treba da napravil dinamicko ucitavanje assembly-a. I to tako sto program periodicno proverava odredjeni direktorijum,i cim se pojavi novi dll fajl u njemu on ga ucitava,provjeri da li implementira odredjeni interface i pokrece execute metodu.
Moje resenje:
Koristio sam FileSystemWatcher, postavio filtere i sve sto treba.Medjutim posto je isti cesto vracao po nekoliko eventa, ubacio sam dodatni Timer, preko kojeg cekam po sekundu izmedju provjera.
Sve to fino radi osim toga sto kod linije:
Code:
Assembly load = Assembly.LoadFrom(e.FullPath);
dobijam ovaj FileLoadException:
Could not load file or assembly 'file:///d:\plugins\test.dll' or one of its dependencies. The process cannot access the file because it is being used by another process.
Naravno prije ove gornje zaustavim FileSystemWatcher :
Code:
watcher.EnableRaisingEvents = false;
Da li je imao neko slican problem?
|
[ deerbeer @ 15.04.2008. 15:50 ] @
Probaj da izbegnes FileSystemWatcher jer mozda (nisam siguran 100%) on drzi jos neke handle-ove od fajlova ..
Alternativa je da koristis timer i u njegovom tick eventu da izlistas sve fajlove (System.IO.Directory) koje se nalaze u plugin direktorijumu i onda da ucitas modul ..
[ vujkev @ 15.04.2008. 15:58 ] @
FileSystemWatcher reaguje na upisivanje prvog bajta na disk što će reći da u trenutku kad pokušavaš da učitaš assembly on verovatno nije u potpunosti snimljen u folder
[ bags @ 15.04.2008. 16:07 ] @
Obojica ste naravno u pravu.
A da li bi bilo dovoljno da stavim Thread.Sleep() na recimo dvije sekunde prije ucitavanja assembly-a ?
U principu nije problem sa ostatkom aplikacije, a najbrze mi je resenje. :)
[ Shadowed @ 15.04.2008. 16:29 ] @
Osim ako kopiranje tog .dll-a na tu lokaciju ne traje duze od 2sec.
[ bags @ 15.04.2008. 18:40 ] @
Posto su uglavnom fajlovi koji su velicine par stotina kb i kopiraju se lokalno sa hdd ,mislim da nece biti problem.
Hvala na odgovorima.
[ deerbeer @ 15.04.2008. 18:43 ] @
Citat:
@bags
U principu nije problem sa ostatkom aplikacije, a najbrze mi je resenje. :)
Nekad "najbrze resenje" ne donosi ni blizu 100% pouzdanosti koda ... :)
[ mmix @ 16.04.2008. 08:26 ] @
Ako ti je vec ok da blokiras thread dok plugin ne bude dostupan, onda ti je mozda bolje resenje da jednostavno udjes u petlju i prvo ti probas da otvoris fajl u exclusive locku, i da pokusavas dok ga ne dobijes sa malim pauzicama izmedju (recimo 100ms). Posle toga zatvori fajl i pozovi Assembly.Load... Tako ces cekati minimalni period vremena.
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.