2009-11-03 10 views
46

Ho bisogno di qualche chiarimento. Ho una dll di Reportwriter che utilizza Crystal Reports. È scritto in VB6. Devo aggiungere questa DLL al mio progetto asp.net, dove crea una DLL di interoperabilità.Qual è la DLL di interoperabilità?

A mio parere, la dope di interoperabilità è presente come intermediario in modo che il mio codice .net possa parlare alla dll di Reportwriter.

Così registro il file interop dll o registro la DLL originale?

+0

+1 Penso che sia stata una buona domanda anche se nessun altro voterà per te. :) – Dusty

risposta

85

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.

+0

Quindi, come fa l'interoperabilità a sapere dove si trova la dll del report, quando eseguo chiamate ai suoi metodi dal mio codice .NET? L'interoperabilità traduce una chiave nel registro? –

+1

Quando si registra il componente COM, la sua posizione viene registrata nel registro e può essere recuperata da lì se il GUID del componente è noto. L'assembly di interoperabilità conosce GUID per la libreria dei tipi da cui è stato generato e GUID per tutti i tipi all'interno di tale libreria dei tipi: sono archiviati come attributi .NET. Il runtime utilizzerà quindi queste informazioni per risolvere il componente COM tramite il registro. –

2

Sei corretto. La DLL di interoperabilità esegue il wrapping delle chiamate al componente VB6 e le rende trasparenti.

Quando si registrano le DLL sulla macchina su cui si eseguirà l'applicazione, è necessario registrare la DLL VB6. La DLL interop ospiterà la cartella bin della tua app e Marshall le chiamerà.

2

È necessario registrare la DLL VB6 e farne riferimento nel progetto .NET; quel riferimento creerà il tuo Interop.dll

Problemi correlati