10. september 2004 - 11:11Der er
16 kommentarer og 1 løsning
COM problemer
jeg har to projekter: 1) en .NET komponent der registreres som COM komponent 2) en fil der indeholder interfaces (kaldet TheInterfaces) der bruges flittigt af flere andre komponenter (og deriblandt COM komponenten fra punkt 1)
Jeg får følgende fejl når jeg kompilerer:
COM Interop registration failed. Could not find a type library for assembly 'TheInterfaces'.
Hvad skal jeg dog gøre for at få det til at virke?
I lang tid har samarbejdsbranchen fokuseret på at forbedre enhedsfunktioner – bedre kameraer, klarere lyd og smartere software. Men den virkelige forvandling handler ikke om funktioner.
.. du kan få en mere sigende fejlbesked hvis du prøver at køre "tlbimp" i en kommandoprompt med din .tlb som argument... den siger noget i stil med "type library was exported from a CLR assembly and can not be re-imported as a CLR assembly"
...det har jeg gjort. Problemet er tilsyneladende at min .NET komponent (COM komponenten) er "ked af" at min interface.dll ikke er registreret som COM (da der derfor ikke er noget type library => tlb). Og når jeg så registrerer TheInterfaces som COM, kommer der en ny fejl:
"COM Interop registration failed. There are no registrable types in the built assembly." (og det er altså TheInterfaces, der refereres til her)
Denne fejl forsvinder når jeg putter en tom klasse ind i TheInterfaces projektet (altså gir den en type, så den kan tie stille):
public class test{}
Nu er der ingen fejl. Men jeg føler at jeg er ude i en cowboy-løsning når jeg har indsat en tom klasse for at afhjælpe et problem.
Har du nogen forklaring ell. andet på dette problem?
min solution er et modul, der faktisk kan kører under et andet program. Herudover er der muligt at køre plugin's i mit modul. så der er tre lag:
[MAIN PROGRAM] [mit modul] [plugin's til mit modul]
der er 3 overordnede dele i mit modul: 1) en .NET komponent der er registreret som COM-komponent (bruges til print) - denne komponent skal registreres som COM, da [Main program] (som ikke er .NET) skal kunne kalde denne print handler. 2) en interface assembly, der indeholder interfaces til plugin's der kører under mit modul 3) resten af projektet (består af flere assemblies)
printer-komponenten registreres som COM. Denne komponent er afhængig af (dvs. der er en reference til) interface assembliet.
men: interface assembliet er ikke registreret som COM, hvilket har medført den første fejl : COM Interop registration failed. Could not find a type library for assembly 'TheInterfaces'.
det jeg så gjorde var: at lade interface assembliet registrere sig som COM interop. altså :
højre klik på projektet og i properties->configuration_properties->build vælger jeg register for COM interop = true.
Dette har så medført en ny fejl: COM Interop registration failed. There are no registrable types in the built assembly
Den nægter simpelthen at lave en COM-komponent uden en klasse i (dvs. kun med assemblies). Dette har jeg så løst ved at putte en nyttesløs tom klasse ind: public class test {}
nu virker det. Men har jeg nogle alternativer eller er dette vejen frem? Det der har affødt problemet er nok at jeg har puttet interfaces ud i en seperat fil. Dette er gjort for at jeg kan opdatere alle interfaces uden at opdatere anden kode.
hmm - jeg ved ikke lige hvad den rigtigt løsning er til dette problem... faktisk tror jeg ikke at ville lægge interface'ene i en assembly for sig selv, men bare ha' dem i en fil. Interfacene og koden hænger ret tæt sammen, så man bør ikke udvide interfaces ved bare at f.eks. tilføje en metode - man bør lave et nye interface der arver fra det gamle.. men det er en smagssag :)
enig i at ISomeInterface2 arver fra ISomeInterface. Men jeg har jo kvajet mig kan jeg godt se :). For man vinder ingenting ved at ligge interface'ne ud i en fil... Jeg gjorde det for at gøre det nemmere at installere addin's, men det hjælper jo ingenting at ligge interface'ne ud i en fil. Koden der håndtere addins skal stadig opdateres, og den afhænger igen af mere kode... osvosv. og tilsidst bliver konklusionen at :
når et interface opdateres skal hele modulet releases til slutbrugere (evt. sammen med alle eksisterende addins til modulet) - hvorefter man kan installaere addins igen uden at opdatere modulet...
men så er spørgsmålet: hvordan deler jeg een fil - der indeholder et interface - til flere projects (i mit tilfælde er alle projects i samme solution i visualStudio .NET ) ?
...så interfacet bliver kompilet ind i alle de assemblies, der skal bruge det. eller vil det være nok at kompile interfacet ind i een assembly (modulet) som addins så refererer til ?
Med mindre at dine plugin's afhænger af hinanden, så kan du bare "Add existing item" til hvert at projekterne. Hvis nogle plugin's afhænger af andre plugin's skal du bare være opmærksom på at du får et antal warnings om at dit interface er defineret flere gange.
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.