Newsgroup: it.comp.lang.visual-basic
Titolo: [NET] [?] Assembly --> ActiveX, ci riprovo

Ho fatto quattro test sull'argomento e ancora non ne sono uscito.
Ho fatto in 
VB.NET
 la semplice classe
---
Imports System
Imports System.Runtime.InteropServices
Imports Microsoft.VisualBasic
<ComClass("7666AC25-855F-4534-BC55-27BF09D49D46", _ 
"54388137-8A76-491e-AA3A-853E23AC1217", _
"EA329A13-16A0-478d-B41F-47583A761FF2")>  _
public class Test
    public function Add(i1 as int32, i2 as int32) as int32
         return i1 + i2
    end function
end class
---
L'ho compilata, ho creato la tlb con tlbexp.exe.
Tutto ok, in VB6 allego la tlb, vedo sia la classe che i suoi metodi, ma 
quando faccio:
     Dim p As Test
     Set p = New Test
     Me.Caption = p.Add(2, 3)
si blocca sul Set e mi dice che il componente ActiveX non può creare 
l'oggetto.
Poi ho alcuni dubbi: l'attributo ComClass è contenuto in 
Microsoft.VisualBasic.
1) Questo significa che non è possibile creare oggetti COM senza 
includere questo namespace?
E con altri linguaggi, es. C#?
2) A cosa mi serve, se mi serve il namespace Runtime.InteropServices?
Ciao

 "EA329A13-16A0-478d-B41F-47583A761FF2")>  _
Io però ho sempre usato questo attributo:
<System.Runtime.InteropServices.Guid("TUAGUID")>_
Compilo, esporto con TLBExp e tutto funziona (quasi) a meraviglia.
                        Ciao
                                                Allanon
-- 
- SPAMKILLER
 L'indirizzo delle risposte é 
itlangv...@michele.sytes.net
 LASCIATE il NOSPAM fa parte dell'indirizzo :-)
  Per superare le impostazioni di protezione antispam scrivete
  nel testo del messaggio la scritta "SPAMKILLER"
Scusate il disturbo, ma non posso più di pubblicità

 Compilo, esporto con TLBExp e tutto funziona (quasi) a meraviglia.
Usando questo, non solo ho lo stesso errore, ma addirittura l'object 
explorer non mi vede nemmeno i metodi esposti.
Per favore, puoi dirmi il codice e i passi esatti per "convertire" la 
classe che ho postato piů in alto?
Ciao

 explorer non mi vede nemmeno i metodi esposti.
In effetti credevo che fosse uno dei limiti imposti dal passaggio, ma se mi
dici che invece con l'attributo ComClass tutto si vede forse il motivo é un
altro...
Io prima di effettuare l'export della TLB (o anche dopo, non dovrebbe
cambiare niente) registro l'assembly (non dovrebbe servire inserirlo nella
GAC, ma mai dire mai...).
Per registrare l'assembly:
"c:\WINNT\Microsoft.NET\Framework\v1.0.3705\regasm.exe" "Path&NomeAssembly"
/tlb:"Path&NomeTLB"
Per registrare nella GAC:
"c:\WINNT\Microsoft.NET\Framework\v1.0.3705\gacutil.exe" /i
"Path&NomeAssembly"
In bocca al lupo! :)


 GAC, ma mai dire mai...).
Ok, funziona (o quasi) :)
Ecco cosa serve:
- L'attributo <System.Runtime.InteropServices.Guid(strGUID)> per le 
classi che si vogliono esportare.
- L'attributo <AssemblyKeyFile(file.snk)> per l'assembly per avere uno 
"strong name".
File.snk viene generato con C:\>sn.exe file.dll
- Compilare l'assembly
- esportare la TypeLibrary con C:\>tlb.exe file.dll /out:file.tlb
- registrare l'assembly con C:\>regasm.exe file.dll /tlb:file.tlb
- installare l'assembly con C:\>gacutil.exe /i file.dll
Questi passaggi sembrano, dalle sempre poche prove che ho fatto, tutti 
obbligatori.
Ora si può lanciare VB, referenziare file.tlb e lavorare con il nostro 
assembly :)
Però ci sono ancora delle cose poco chiare:
- l'SDK parla di utilizzo di assembly COM senza registrazione, ma non mi 
è molto chiaro nemmeno di cosa stia parlando :) (basta cercare GUID 
nell'indice della guida).
- Continuo a non vedere i membri delle classi esportate, ed è molto strano.
Ciao

 - Continuo a non vedere i membri delle classi esportate, ed è molto strano.
Questo è un workaround che però non mi piace molto perchè anche lui 
funziona a metà :)
Se io definisco un'interfaccia per la classe da esportare e implemento 
quest'interfaccia nella classe la TLB esportata contiene:
- La classe, senza metodi.
- L'interfaccia completa di metodi.
Poi da VB posso fare una cosa di questo tipo (mettendo che la classe si 
chiami Test e l'interfaccia ITest):
     Dim c As ITest
     Set c = New Test
In questo modo funziona tutto normalmente, solo continua a non sembrarmi 
normale.
Ciao

 normale.
Beh... non lo é molto...



--
.A
UGIdotNET - User Group Italiano .NET
http://www.ugidotnet.org

 e guarda cosa succede... :-)
Fantastico!
Spaziale!
Non solo mi nasconde l'interfaccia e mi mostra la classe come "deve" 
essere, ma mi espone anche i membri derivati come ToString e GetType.
Così sì che mi piace :)
Però mi confermi che sono necessari tutti e tre i passi
- tlbexp
- regasm
- gacutil
?
In effetti non mi è chiaro perchè l'ultimo sia necessario, però ho 
riprovato e senza non funziona :( dice che non trova delle dipendenze...
Ciao

 riprovato e senza non funziona :( dice che non trova delle dipendenze...
Mi pare che in questo caso vale anche per COM quello che vale per le
assembly normali; ovvero se la dll non viene installata nella GAC, allora
deve essere nella stessa directory dell'applicazione (in questo caso il
client VB6) oppure devi specificare il percorso nel tag <codeBase> del file
.config
Non sono sicuro pero' fosse esattamente cosi', avevo scritto del codice di
esempio ma non l'ho sul PC che sto usando in questo momento...
Ciao
--
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown