Compatibilità file DLL

lunedì 15 maggio 2006 - 16.24

Luigi3 Profilo | Junior Member

Ciao a tutti,
ho questo problema: ho creato un file .dll con visual studio 2005 in visual basic .net.
Ho creato un altro applicativo sempre in visual basic .net 2005 per testare quella dll. Quando eseguo quest'ultimo programma nell'istruzione

aObj = CreateObject("dll_control.DLL_control")

ricevo un errore di tipo:"Impossibile creare il componente ActiveX."

Sapreste dirmi dove sbaglio?

Il file dll si chiama DllControl.dll e l'ho registrato.

Cosa potrei fare?

Grazie

lbenaglia Profilo | Guru

>ho questo problema: ho creato un file .dll con visual studio
>2005 in visual basic .net.
>Ho creato un altro applicativo sempre in visual basic .net 2005
>per testare quella dll. Quando eseguo quest'ultimo programma
>nell'istruzione
>
>aObj = CreateObject("dll_control.DLL_control")
>
>ricevo un errore di tipo:"Impossibile creare il componente ActiveX."
>
>Sapreste dirmi dove sbaglio?

Ciao Luigi3,

premetto che tanto tempo fa ero un Dev e conoscevo piuttosto bene l'architettura COM
Che io sappia in VS.NET e superiori (2003 e 2005) non è possibile creare componenti COM nativi, ma piuttosto si possono definire Assembly .NET che possono essere registrati come componenti COM in modo da essere istanziati dai linguaggi di scripting oppure da ambienti di sviluppo COM based come Visual Basic 4.0 - 6.0.
Ora, come si definisce la type library di un Assembly .NET e come si registra nel Registry?
Chi si ricorda?

Facendo una velocissima ricerca con Google ho trovato questo articolo che credo risponda in modo esauriente alla tua domanda:

"Exposing .NET Framework Components to COM"
http://msdn2.microsoft.com/en-us/library/zsfww439.aspx

Ora la mia domanda è: ma la tua intenzione è quella di esporre un Assembly sottoforma di componente COM o cosa?
Nel caso tu voglia semplicemente richiamare un Componente .NET da un client *sempre .NET*, è sufficiente aggiungere una reference all'assembly (in modo del tutto simile a quello che si faceva con l'Early Binding in COM) ed istanziare le classi in esso contenute utilizzando la clausola New:
http://msdn2.microsoft.com/en-us/library/77s47661.aspx

>Grazie
Prego.

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Brainkiller Profilo | Guru

>Che io sappia in VS.NET e superiori (2003 e 2005) non è possibile
>creare componenti COM nativi,

Solo per perfezionare la risposta di Lorenzo.
Installando la parte C/C++ di VS.NET è possibile creare componenti nativi COM.
Con i linguaggi managed .NET (VB.NET e C#) invece no perchè fanno parte di un'architettura come già detto diversa.
ciao

David De Giacomi
Microsoft MVP
http://blogs.dotnethell.it/david/

lbenaglia Profilo | Guru


>Installando la parte C/C++ di VS.NET è possibile creare componenti
>nativi COM.

Grazie David,

hai ragione, da ignorante patentato in C++ non avevo considerato questa possibilità

Ciao!

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Luigi3 Profilo | Junior Member

Date le notevoli difficolta' incontrate ho ritenuto piu' veloce riscrivere la dll active X da capo direttamente in VB6. Provandola con un altro programma anch'esso scritto in VB6, ricevo ancora questo errore: "il componente activeX non puo' creare l'oggetto" riferito sempre alla riga
Set aObj = CreateObject("dll_control.DLL_control")

Ho anche registrato con regsvr32 il file dll creato, ma l'errore c'e' sempre. Cosa sbaglio?

Grazie

lbenaglia Profilo | Guru

>Ho anche registrato con regsvr32 il file dll creato, ma l'errore
>c'e' sempre. Cosa sbaglio?

Ciao Luigi,

come possiamo saperlo senza aver dato un'occhiata al tuo codice?
Zippa il progetto del componente COM e del client ed allegalo ad un post.


--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Luigi3 Profilo | Junior Member

Questo è l'applicativo di prova. Appena lo mando in esecuzione si ferma alla riga descritta precedentemente. Intanto potreste gia' dirmi qual'e' la causa di questo errore?
Grazie ancora per l'immensa disponibilità

Luigi3 Profilo | Junior Member

Questo è l'applicativo di prova. Appena lo mando in esecuzione si ferma alla riga descritta precedentemente. Intanto potreste gia' dirmi qual'e' la causa di questo errore?
Grazie ancora per l'immensa disponibilità

lbenaglia Profilo | Guru

>Questo è l'applicativo di prova.

Da qui si capisce ben poco.
Inizio a darti un paio di consigli:

1) Utilizza l'early binding, ovvero aggiungi il tuo componente ActiveX tra le reference del progetto client e definisci una variabile oggetto utilizzando una classe specifica esposta dal componente;
2) Se hai la necessità di istanziare la classe all'avvio del programma client, dichiara una variabile oggetto Private nella General Declaration Section, istanzia la classe con l'operatore New nell'evento Form_Initialize e impostala a Nothing nell'evento Form_Terminate.

Ora posta come ti ho chiesto il progetto del componente...

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Luigi3 Profilo | Junior Member

Ho referenziato il file dll nel progetto di prova, ma sembra non funzionare.
Se hai visto nell'appliativo precedente faccio queste due operazioni, che credo siano quelle che mi hai descritto nella tua risposta:

Private aObj As Object 'nella general declaration

Set aObj = CreateObject("dll_control.DLL_control") 'nel form load

Ma quando creo il file .dll devo mettere qualche opzione particolare? Mi sembra davvero strano che non riesca a farlo funzionare...

lbenaglia Profilo | Guru

>Ho referenziato il file dll nel progetto di prova, ma sembra
>non funzionare.
>Se hai visto nell'appliativo precedente faccio queste due operazioni,
>che credo siano quelle che mi hai descritto nella tua risposta:
>
>Private aObj As Object 'nella general declaration
>
>Set aObj = CreateObject("dll_control.DLL_control") 'nel form
>load

Scusa Luigi,

hai letto la mia risposta?
Quello che hai scritto viene chiamato Late Binding e comporta una serie di decadimenti di prestazioni ogni volta che andrai a richiamare un metodo|proprietà della classe anche se offre una certa flessibilià rispetto all'Early Binding.

Spulciando il tuo progetto si nota che il nome del componente è "DllControl" e non "dll_control" come hai scritto tu, mentre il nome della classe è "DLL_Control".

Quindi:

- Aggiungi una Reference alla DLL;

- Nella General Declaration Section scrivi:
Private myControl As DllControl.DLL_Control

- Nell'evento Form_Initialize scrivi:
Set myControl = New DllControl.DLL_Control

- Nell'evento Form_Terminate scrivi:
Set myControl = Nothing

- Da qualunque punto della tua Form puoi accedere all'interfaccia esposta dalla classe DLL_Control semplicemente referenziando la variabile oggetto myControl.

--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

Luigi3 Profilo | Junior Member

Perfetto!!! L'unico problema era proprio il nome... porca miseria che str.....ata...

Grazie 1000 per i suggerimenti!!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5