Avatar billede sovsekoder Nybegynder
10. september 2004 - 11:11 Der 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?
Avatar billede sovsekoder Nybegynder
10. september 2004 - 11:12 #1
hele mit projekt er .NET, og jeg er nødt til at registrere den ene komponent til COM brug.
Avatar billede wisen Nybegynder
10. september 2004 - 11:21 #2
.. man kan af en eller anden grund ikke benytte .NET COM komponenter fra .NET - jeg har også været der :)
Avatar billede wisen Nybegynder
10. september 2004 - 11:25 #3
.. 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"
Avatar billede wisen Nybegynder
10. september 2004 - 11:25 #4
.. du skal bare lave en alm. reference til assembliet istedet
Avatar billede sovsekoder Nybegynder
10. september 2004 - 11:58 #5
...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?
Avatar billede wisen Nybegynder
10. september 2004 - 12:11 #6
.. jeg forstår vist ikke helt.. du har en assembly med en COM komponent i, hvis interface er defineres i en anden assembly ?
Avatar billede sovsekoder Nybegynder
10. september 2004 - 12:40 #7
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'.
Avatar billede sovsekoder Nybegynder
10. september 2004 - 12:46 #8
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 {}
Avatar billede sovsekoder Nybegynder
10. september 2004 - 12:47 #9
rettelse: (dvs. kun med assemblies) skulle være (dvs. kun med interfaces)
Avatar billede sovsekoder Nybegynder
10. september 2004 - 12:49 #10
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.
Avatar billede wisen Nybegynder
10. september 2004 - 16:11 #11
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 :)
Avatar billede sovsekoder Nybegynder
10. september 2004 - 17:27 #12
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...
Avatar billede sovsekoder Nybegynder
10. september 2004 - 17:29 #13
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 ) ?
Avatar billede sovsekoder Nybegynder
10. september 2004 - 17:31 #14
...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 ?
Avatar billede wisen Nybegynder
13. september 2004 - 08:38 #15
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.
Avatar billede sovsekoder Nybegynder
13. september 2004 - 12:32 #16
tak for svaret / sparing :) du får point.
Avatar billede wisen Nybegynder
13. september 2004 - 12:37 #17
1 stk. 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