[ vujkev @ 17.01.2008. 12:36 ] @
Prilikom pokretanja programa u "Debug" konfiguraciji dobijam grešku {System.InvalidCastException}. Možda to i ne zvuči toliko čudno, ali ako konfiguraciju promenim u "Release" sve radi kako treba. Još jedna čudna stvar je ta da je pre mesec dana isti kod radio u obe konfiguracije.

Probao sam da uradim Clean Solution, brisao ceo folder gde se nalazi debug konfiguracija, gasio VS i ostao bez ideje kako (i u čemu) je problem

Problematični kod je

Code:

        For Each File As IO.FileInfo In New IO.DirectoryInfo(sFolder).GetFiles("*.dll", IO.SearchOption.AllDirectories)
            Dim Asm As Reflection.Assembly
            Dim cParser As IParser
            Try
                Asm = Reflection.Assembly.LoadFrom(File.FullName)
                For Each t As Type In Asm.GetTypes
                    If Not t.GetInterface("IParser") Is Nothing Then
                        cParser = DirectCast(Asm.CreateInstance(t.Namespace & "." & t.Name), IParser)   ' <---- greška je naravno ovde
                        ...
                        ...
                        ...
                    End If
                Next
            Catch ex As Exception
                debug.print ex.message
            End Try
        Next



Da li neko ima rešenje?
[ mmix @ 17.01.2008. 13:24 ] @
Hmm, izgleda weird, jedino sto mi mozda pada na pamet je da u releasu ucitava i neki drugi DLL koji ima klasu sa IParser interfejsom iz drugog namespace-a pa prodje if a pukne cast. Probaj da u GetInterface testiranju iskoristi full name IParser interfejsa...
[ vujkev @ 17.01.2008. 13:54 ] @
Probao

Code:

If Not t.GetInterface("SuVu.Tabulator.Common.IParser") Is Nothing Then
    cParser = DirectCast(Asm.CreateInstance(t.Namespace & "." & t.Name), SuVu.Tabulator.Common.IParser)


i ne radi
[ mmix @ 17.01.2008. 16:31 ] @
OK, ajmo onda na dijagnostiku, ubaci jos jedan try/catch unutar ForEach(t) i kad ti pukne vidi za koju klasu ti je pukao pa onda pogledaj koja je to klasa i dal ta klasa podrzava IParser i ako ne kako je uspela da prodje kroz if uslov

Sad se nesto setih jos, gde ti je deklarisan SuVu.Tabulator.Common.IParser? Da nije naleteo na njega i pokusava da instancira interfejs (sto ne moze)?

[ vujkev @ 18.01.2008. 00:09 ] @
Probao još jedan try catch - ista greška
Proverio iz kog fajla pokušava da napravi instancu - nije onaj gde je definisan interface. Nisam napomenuo da petlja treba da napravi instance iz četiri različita fajla i da na svim fajlovima pravi grešku

i onda ....

kopirao projekat sa externog HDD-a (sa kog sam ga direktno startovao) na lokalni disk i verovali ili ne sve radi kako treba :( Koje su šanse da to može da bude greška (predpostavljam velike) i kako može da se ispravi??????

Ako se dobro sećam ranije sam projekat startovao direktno sa USB-a i nisam imao ovih problema. Probaći sutra opet sa USB-a pa ću javiti rezultat.


[ Shadowed @ 18.01.2008. 00:59 ] @
Heh, pre skoro tacno tri godine sam imao vrlo slican problem koji nisam uspeo resiti. Evo link, ako ima nesto korisno tamo a i cisto zbog poveznosti slicnih tema - http://www.elitesecurity.org/t91336
(ne znam sta sam posle poslednjeg posta u toj temi radio, u svakom slucaju nisam uspeo)
[ mmix @ 18.01.2008. 11:27 ] @
Ne bi trebalo da ti ima veze, removable storage se vodi kao lokalni diskovi ne podpada pod default codesecuity zabrane.
Pogledaj kao prvo sledece, da li se uopste instancira objekat kroz CreateInstance, mozda cast puca zato sto kreiranje objekta nije proslo kako treba i vratilo null. CreateInstance vraca null ako tip sa tim imenom nije pronadjen (za svaki slucaj, umesto t.Namespace & "." & t.Name koristi t.FullName)
[ vujkev @ 21.01.2008. 10:28 ] @
Eto mene opet

Objekat se kreira bez greške
Code:

Dim o As Object = Asm.CreateInstance(t.FullName)
cParser = DirectCast(o, SuVu.Tabulator.Common.IParser)


ali dalje opet isto
[ Shadowed @ 21.01.2008. 11:36 ] @
Cek, moze li uopste da se cast-uje u interface? Ne kazem da ne moze, ali mi malo cudno izgleda, jer ne mozes imati instancu interfejsa.
[ vujkev @ 21.01.2008. 11:48 ] @
Kad prebacim u release konfiguraciju ovaj kod radi tako da je odgovor: "Da, može"
[ mmix @ 21.01.2008. 11:49 ] @
Mozes imati referencu na interfejs unutar postojece instance neke klase koja ga implementra, i ta reference se izvlaci kroz castovanje i u potpunosti je ukljucena u GC object graph (tj objekat nece biti pociscen kad sve reference odumru ako postoji interface referenca nad tim objektom):

IParser ip = (IParser)objekat;

jedino sto ne mozes je da kreiras novu instancu interfejsa:

IParser ip = new IParser();



Citat:
vujkev: Eto mene opet Objekat se kreira bez greške ali dalje opet isto


Ajd sad pogledaj koji je to objekat i da li on stvarno implementira IParser

[ vujkev @ 21.01.2008. 12:09 ] @
Čisto kao podsetnik, rekao sam da kad kopiram projekat sa externog na interni HDD sve radi kako treba.

Ali da ne budem lenj proverio sam i koji je to objekat, i njegov kod i kao prva linija posle deklaracije klase stoji
Code:

    Implements SuVu.Tabulator.Common.IParser


tako da i to pada u vodu