meta dati per questa pagina
Chiamata di un componente .NET da un componente COM
Chiamare da .Net un componente COM non e' niente di trascendentale, anzi e' molto semplice.
Il contrario pero' non e' cosi' immediato.
L'ho scoperto a mie spese quando mi e' capitato di dover chiamare appunto un assembly creato in .Net da un asp.
Certo, la via semplice era farsi un progettino Asp.Net e, semplicemente usarlo ma, siccome bisognava integrarlo in un sito preesistente non mi pareva il caso di creare una directory virtale apposta.
Allora mi sono un po' informato sulla fattibilita' della cosa.
La cosa e' fattibile in quanto prevista da Microsoft stessa ma, sorprendentemente, il metodo proposto nel mio caso non funzionava minimamente.
Cerca e cerca sul web alla fine ho trovato, tra gli altri, un metodo semplice, veloce e, praticamente, indolore.
Consiste in pochi semplici passaggi:
creare la libreria di classi .NET con le classi che ci interessano (ovviamente)
c'e' chi suggerisce di creare anche la classe pubblica d'interfaccia per poi agevolare la successiva creazione della type library COM
nel mio caso, essendo una classe pulita non e' stato necessario
creare il nome sicuro
il nome sicuro e' un file che viene associato all'assembly che contiene un guid ed indica univocamente l'assembly
l'istruzione manuale (se l'IDE che usiamo non l'ha tra le opzioni del progetto) e' la seguente:
sn.exe -k C:\Sviluppo\test\obj\Debug\mykey.snk
sn.exe lo trovate nella cartella dov'e' installato l'SDK del Framework usato
aggiungere al progetto un riferimento a System.EnterpriseServices
e successivamente aggiungere, nel caso di vb.net, nel file AssemblyInfo.vb
<Assembly: AssemblyKeyFile("mykey.snk")>
nota: tutti i progetti referenziati devono avere un nome sicuro
bisogna anche aggiungere, sempre nell'AssemblyInfo.vb:
Imports System.EnterpriseServices Imports System.Runtime.InteropServices <Assembly: ApplicationName("nomeclasslibrary")> <Assembly: ApplicationActivation(ActivationOption.Server)> <Assembly: ApplicationAccessControl(False, AccessChecksLevel:=AccessChecksLevelOption.ApplicationComponent)>
compilare (ovviamente)
registrare l'assembly come oggetto COM
questo vi permettera' di vederlo, appunto, come oggetto com da qualsiasi vecchia applicazione od anche da asp o vbs(non .net)
l'istruzione e':
%windir%\Microsoft.NET\Framework\versione usata\regasm.exe c:\Sviluppo\test\bin\test.dll /tlb /codebase
l'opzione /tlb serve a creare il corrispondente file .tlb della type library
l'opzione /codebase permette di rendere visibile l'assembly come generale, nel caso venga utilizzato solo da un'applicazione puo' essere omesso, basta che l'assembly sia nella stessa cartella dell'applicazione che lo usa (oppure, naturalmente, in %windir%\System32)
usarlo via COM
via COM va utilizzato come qualsiasi altro componente in late binding ovvero, nel caso di vb, con
CreateObject("nomeassembly.classe")