2012-02-13 15 views
6

Ho cercato di chiamare una DLL vb6 da un'applicazione C sharp, senza utilizzare il registro. Voglio usare il percorso della DLL durante l'utilizzo. Non riesco a creare un oggetto della classe della vb dll. Per favore aiuto! Il codice che ho scritto finora è come segue:Chiamare vb6 dll da C#

Assembly assem = Assembly.LoadFile("dll path"); 
Type classType = assem.GetType("classname"); 
MethodInfo method = classType.GetMethod("show"); //My methos is called show 
method.Invoke(null,null); // I have to invoke the method using class object, which I am unable to create 
+5

'VB6' DLL dovrebbe essere' PInvoked', il modo in cui si sta attualmente caricandoli è per '.NET' DLL – fardjad

+0

@bhavna io non sono sicuro se è possibile utilizzare VB6 DLL usando' Assembly.LoadFile '. Hai provato a chiamare la funzione usando [PInvoke] (http://msdn.microsoft.com/en-us/library/aa288468%28v=VS.71%29.aspx)? – Searock

+0

Ok. Grazie mille per il suggerimento. Ma sono molto nuovo nel framework c. Potresti per favore guidarmi su come il codice per chiamare un metodo da una db vb6 deve essere scritto in c sharp? Qualsiasi tipo di aiuto sarebbe apprezzato. – bhavna

risposta

1

Supponendo che il metodo show è nella tabella di esportazione nella DLL, provare a utilizzare DllImportAttribute per chiamare il metodo show.

+0

Questo è un buon approccio – Ravia

+1

99 volte su 100 una DLL VB6 non esporrà nulla di utile attraverso la tabella di esportazione. Sono COM DLls. (* Raramente * un autore di DLL usa le tecniche dei blackbelt per esportare le funzioni come se la DLL fosse una DLL vecchio stile.) – MarkJ

+0

Puoi per favore darmi un esempio del codice richiesto per fare lo stesso? – bhavna

6

Una DLL VB6 è una DLL COM. Di solito dovresti registrare la DLL (nel registro) e quindi aggiungere un riferimento alla DLL VB6 dal tuo progetto .NET.

Questo MSDN article offre una panoramica dell'utilizzo di COM priva di registro da un'app .Net.

+0

Grazie ragazzi per il vostro aiuto, ma questi gli articoli forniscono informazioni sull'uso delle dll win32 soltanto: '(Ho una db vb6 da usare in C# . – bhavna

+1

Il link include informazioni su client .Net e server VB6. Guarda questa sezione, Passaggio 2, parte B http://msdn.microsoft.com/en-us/library/ms973913.aspx#rfacomwalk_topic5 e questa sezione http://msdn.microsoft.com/en-us/library/ms973913 aspx # rfacomwalk_topic7. Sono d'accordo che sarebbe meglio se l'articolo non provasse a coprire C++, C#, VB.Net e VB6 tutto in un unico articolo! – MarkJ

2

La tua DLL VB6 come menziona MarkJ è una DLL COM e di solito devono essere registrati utilizzando regsvr32 prima di poterli utilizzare.

Una volta registrato, è possibile aggiungere un riferimento ad esso come si farebbe con una DLL .NET, ovvero fare clic con il pulsante destro su Riferimenti nel progetto, fare clic su Aggiungi riferimento, quindi selezionare la scheda COM nella finestra e cercare il proprio Nome Dll COM.

Quindi dovresti essere in grado di usarlo come un riferimento .NET.
Ecco un esempio di come utilizzare un riferimento COM in Microsoft Excel.
How to: Use COM Interop to Create an Excel Spreadsheet

Se si desidera specificamente tardiva, allora il vostro DLL deve ancora essere registrato, ma non si aggiunge manualmente un punto di riferimento, si utilizza Activator.CreateInstance() per ottenere un'istanza del vostro oggetto COM.
Calling COM component from C# using late binding

+0

Ciao, ho bisogno di usarlo con il late binding, senza usare le informazioni del registro. Questo è il problema! – bhavna

+1

Puoi darmi maggiori dettagli sul tuo scenario, per favore? Il dll sarà registrato sui sistemi di destinazione e non solo sul tuo? Perché non penso che sia effettivamente possibile utilizzare dll COM senza averli registrati. – Nanhydrin

+0

Questo articolo potrebbe essere rilevante [Attivazione gratuita della registrazione dei componenti COM] (http://msdn.microsoft.com/en-us/library/ms973913.aspx) – Nanhydrin