Quando scrivi il codice in VB6, il risultato compilato è un componente COM. I componenti COM forniscono interfacce, coclassi, strutture ed enumerazioni, che sono normalmente descritti utilizzando una libreria di tipi COM. Tuttavia, per consumare tale componente COM in .NET, è necessario digitare la descrizione in un formato comprensibile a .NET, ovvero un assembly .NET (poiché non può funzionare direttamente con le librerie dei tipi). Un assembly di interoperabilità è quindi solo una libreria di tipo COM "convertita", nel senso che contiene descrizioni di interfacce, strutture ecc. Che corrispondono alle stesse cose in una libreria di tipi.
(Quanto sopra è un po 'semplificato, come assembly di interoperabilità non si hanno ad essere prodotta da una libreria di tipi - è possibile a mano il codice uno se si vuole, per esempio.)
Contrariamente a quanto è spesso detto, un assembly di interoperabilità non contiene alcun codice eseguibile e non esegue alcun marshalling. Contiene solo definizioni di tipo e l'unica posizione in cui può avere metodi è nelle interfacce e i metodi nelle interfacce non hanno un'implementazione. Le chiamate di Marshaling .NET a quelle di COM vengono effettivamente eseguite da CLR stesso in base alle descrizioni dei tipi caricate dagli assembly di interoperabilità: esso genera immediatamente tutto il codice necessario.
Ora come alla tua domanda. È necessario registrare il progetto DLL COM (l'output del VB6), ad esempio utilizzando regsvr32.exe
. Non dovresti (in effetti, non puoi) registrare un assembly di interoperabilità in questo modo, perché non è un componente COM - è solo un assembly .NET semplice, quindi puoi metterlo nella stessa cartella con il tuo .exe/.dll o metterlo in GAC, come al solito.
fonte
2009-11-04 00:12:07
+1 Penso che sia stata una buona domanda anche se nessun altro voterà per te. :) – Dusty