Avatar billede dresen Nybegynder
31. august 2009 - 14:06 Der er 11 kommentarer og
1 løsning

System.TypeLoadException - i forbindelse med brug af ekstern dll

Hej eksperter

Jeg har problemer med at gøre brug af en klasse i en assembly, som jeg refererer til fra en klasse i en anden assembly.

Den klasse der refereres til, genererer jeg vha. af en aspect weaver (YIIHAW). Jeg håber I kan hjælpe mig til at finde ud af,
hvorvidt jeg gør noget forkert (det mest sandsynlige) eller om weaveren genererer en ugyldig assembly.

I et forsøg på at finde en kilde til problemet, har jeg betragtet den pågældende type 'TargetAssy.Course' vha. hhv. IL DASM og Reflector.
Begge disse værktøjer kan vise typen uden problemer. Se den specifikke dll under placeringen YIIHAW_question\YIHAWIntroductionTestEkspertenError\Nant\Assemblies i nedenfor nævnte test.

Jeg modtager nedenstående fejlmeddelese, når jeg forsøger at eksekvere programmet. WovenAssy er den assembly der refereres til (jf. ovennævnte forklaring):

Unhandled Exception: System.TypeLoadException: Method 'AddTo' in type 'TargetAssy.Course' from assembly 'WovenAssy, version=0.0.0.0, Culture=neutral,
PublicKeyToken=null' does not have an implementation.
at TestClass..ctor()
at TestClass.Main(String[] args)

Her en gennemgang af hvad jeg forsøger at opnå. Jeg har en type 'Course', som jeg 1) vil have til at implementere et interface 'From' (typestructure modification)
2) injeciere metodedefinitionen til metoden AddTo (construct introduction). Metod    en AddTo er erklæret i interfacet 'From'.

Man kan læse om YIIHAW her: www.itu.dk/~sestoft/papers/yiihaw-usage-guide.pdf
Bemærk afsnit 8.2 og 8.3, som omhandler 'introduction' og 'typestructure modification'.

Jeg har lavet to eksempler, som kan hentes fra følgende adresse: http://www.megaupload.com/?d=GLD18B8U. Bemærk det to bat-filer placeret i roden af mappen 'YIIHAW_question' de sørger for at kalde nant buildfiles, som sørger for hhv. at compile, weave og i sidste ende eksekvere testprogrammet.

I det første eksempel 'YIHAWIntroductionTestEksperten' foretages der ikke typestructure modification, og der opstår ikke problemer. I det andet eksempel ikke noget problem. I det andet eksempel 'YIHAWIntroductionTestEkspertenError' angives det at klassen 'Course' skal implementere interfacet 'From'. Her opstår
problemet.

Her vises pointcut-filen (filen der specificerer hvilke ændringer weaveren skal foretage - se afsnit 8 i 'usage guide' for en beskrivelse) fra eksemplet der medfører fejl. Det er den fjerde linie der beskriver type modification:

insert field * instance double AdviceAssy.AdviceClass:fi into TargetAssy.Course;
insert method public instance void AdviceAssy.AdviceClass:AddTo() into TargetAssy.Course;
insert type AdviceAssy.From into TargetAssy;
modify TargetAssy.Course implement AdviceAssy.From;

Jeg findet det rimeligt at tildele /mange point/ til en evt. svarer, da det kræver lidt arbejde at sætte sig ind i problemet + de filer der linkes til.

På forhånd tak
Avatar billede dresen Nybegynder
05. september 2009 - 02:13 #1
Der har sneget sig et "." (punktum) ind i linket til megaupload.

Her er det korrekte link: http://www.megaupload.com/?d=GLD18B8U
Avatar billede arne_v Ekspert
06. september 2009 - 22:50 #2
Jeg har kigget lidt på det.

Det er tilsyneladende nemt at få det til at virke hvis man ændrer:

public class AdviceClass

til:

public class AdviceClass : From

Så hvis dit ønske bare er at det skal virke, så er det all fine.

Men jeg gætter på at du også gerne vil vide hvorfor.

Og det er ikke helt klart for mig hvorfor det skal være sådan. Mit gæt er at der i IL koden skal være noget som definerer at en metode er en del af et interface.
Avatar billede arne_v Ekspert
06. september 2009 - 22:56 #3
Jep. Det kan bekræftiges.

Ikke virker:

.method public hidebysig instance void  AddTo() cil managed

Virker:

.method public hidebysig newslot virtual final instance void  AddTo() cil managed

Jeg gætter på at virtual skal være der for at en metode kan opfylde et interface.
Avatar billede arne_v Ekspert
06. september 2009 - 22:58 #4
Dine nant build filer er iøvrigt noget uhensigtsmæssige, hvis du spørger mig.
Avatar billede arne_v Ekspert
06. september 2009 - 23:32 #5
Et hurtigt eksperiment viser iøvrigt at vil man lave det samme med AspectDNG, så har man også behov for at lade AdviceClass implementere From. Så det er nok som det skal være.
Avatar billede arne_v Ekspert
06. september 2009 - 23:32 #6
I AspectDNG ser det ud som:

using DotNetGuru.AspectDNG.Joinpoints;

namespace AdviceAssy
{
    [ImplementInterface("TargetAssy.Course")]
    public interface From
    {
        void AddTo();
    }
}

og:

using System;

using DotNetGuru.AspectDNG.Joinpoints;

namespace AdviceAssy
{
    public class AdviceClass : From
    {
        // field to be introduced
        [Insert("TargetAssy.Course")]
        public double fi;
        // method to be introduced
        [Insert("TargetAssy.Course")]
        public void AddTo()
        {
            Console.WriteLine("hej verden fra AddTo method def");
        }
    }
}
Avatar billede arne_v Ekspert
07. september 2009 - 00:50 #7
Det behøver iøvrigt ikke være dette From interface som AdviceClass implementerer. Ethvert interface som har en AddTo metode kan bruges.

Men det må være klart pænest at bruge dette From interface.
Avatar billede dresen Nybegynder
07. september 2009 - 18:03 #8
Jeg er aldrig nået til at tænke meget over den overordnede struktur - gætter på dét er din primære anke.

Bemeldte NAnt-filer er smækket hurtigt sammen for at gøre jobbet.

Gode råd modtages med kyshånd! :)
Avatar billede arne_v Ekspert
07. september 2009 - 19:09 #9
Min anke går mod at:
- du bruger exec task fremfor csc task til at compile med
- du bruger calltarget fremfor depends
- properties defineres indeni targets og bruges kun en gang
Avatar billede dresen Nybegynder
07. september 2009 - 19:17 #10
Mange tak for hjælpen. Jeg sad ubehjælpeligt fast.

Det er egentlig sjovt, at jeg ikke selv har tænkt på at lade Advice klassen implementere interfacet - godt der er eksperter til :]

Også tak for eksemplet implementeret i AspectDNG. Jeg har rodet en smule rundt med AspectDNG i forlængelse af, at jeg havde læst din artikel om AOP i .NET.

Er ret begejstret for det forhold, at pointcut anvisningerne kan angives inde i advice klassen (mm. man vælger at bruge den eksterne xml pointcut fil), det giver et godt overblik i stil med AspectJ. En anden ting der også begejstrer ved at AspectDNG er, at man kan injicere generic type fields - f.eks.: List<String>. Dette er ikke muligt i YIIHAW.

I det speciale der ligger til grund for udviklingen af YIIHAW, gøres der dog opmærksom på at AspectDNG genererer suboptimal kode set udfra et performance synspunkt:

"generator. Unfortunately the generated code performed
very poorly (in regard to CPU time) due to an inappropiate implementation of the aspect
weaver (AspectDNG [5])"

Jeg har nogle ideer omkring brugen af AspectDNG, som jeg vil forsøge at konkretisere. Der vil nok følge lidt følgespørgsmål.

Angiv endelig et svar!

tak / dresen
Avatar billede arne_v Ekspert
07. september 2009 - 19:26 #11
ApectDNG er desværre aldrig bliver videreudviklet. Jeg tror på at de kunne være blevet noget rigtigt stort, hvis det var blevet ihærdigt videreudviklet de sidste 3 år. Sådan noget som hastigheden på den genererede kode er jo til at optimere på.
Avatar billede arne_v Ekspert
07. september 2009 - 19:26 #12
og et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester