2013-03-12 38 views
5

Sono stato bloccato in questo problema per alcune ore. Spero che qualcuno abbia avuto un problema simile a questo.Debug del progetto VB6 che chiama una DLL .Net (C#)

Abbiamo sviluppato un prototipo .Net (C#) dll utilizzando VS2010 e vorremmo essere in grado di chiamare questa DLL in entrambe le applicazioni C# e l'applicazione VB6.

La mia domanda è:

E 'possibile eseguire il debug di un'applicazione VB6 che chiama una DLL Net? Ho ricevuto un messaggio di errore "Errore di automazione Il sistema non riesce a trovare il file specificato"

Il messaggio di errore suggerisce che c'è qualcosa che manca per il mio VB6 app per trovare la dll .Net.

Sono consapevole che se l'applicazione VB6 è stato compilato, e il file EXE è stato creato, il VB6 chiamerà con successo la funzionalità DLL .Net quando si utilizza il file exe

Tuttavia è importante che possiamo eseguire il debug attraverso la nostra applicazione VB6. Sfortunatamente il debugging non ti permette di scavalcare la linea di codice che istanzia l'oggetto di classe .Net della DLL. Non riesco a farlo.

NOTA: ho dato un'occhiata ai forum e alla documentazione MSDN e trovo principalmente soluzione per chiamare una DLL VB6 in .NET; che purtroppo è il contrario di ciò che dobbiamo fare.

NOTA: Ho già registrato l'assembly compilato .Net (C#) e l'ho fatto riferimento nel progetto VB6.

Ho tuttavia trovato queste due pagine, che sembravano essere ciò di cui abbiamo bisogno, ma è una soluzione per chiamare una DLL .NET (C#) generata utilizzando VS2005. Questo non sembra funzionare quando la DLL .NET (C#) è stata generata utilizzando VS2010.

site1 site2

Se qualcuno potesse dare qualche suggerimento o indicarmi dove posso ottenere uno, che sarebbe grande.

Grazie

SOLUZIONE Grazie a @HansPassant, ho trovato la soluzione. Per eseguire il debug di un progetto VB6 che contiene un assembly C# .NET, è necessario registrare la DLL .NET tramite "regasm" e "gacutil", quindi assicurarsi di chiudere e riaprire l'applicazione VB6 prima di iniziare il debug .

+2

Se ho capito bene la tua domanda, vuoi eseguire il debug dal lato VB 6 (cioè, dall'ID VB 6)? Non sarà possibile: il debugger VB 6 funziona * solo * con il codice VB 6. Non è in grado di gestire il codice nativo e sicuramente non è in grado di gestire il codice MSIL (.NET) poiché non era ancora stato inventato quando VB 6 è uscito. –

+0

Suppongo che dipenda dal framework .Net che usi per compilarlo. Gli esempi che hai trovato sono l'opposto dato che le versioni di Visual Studio cercano di mantenere la retrocompatibilità – luchosrock

+0

wow buon punto @CodyGray. Non l'ho capito, hai ragione. – luchosrock

risposta

0

Non è possibile eseguire il debug di entrambi (facilmente) e passare dal codice VB6 al codice C#. È comunque possibile eseguire il debug singolarmente.

Il debug del codice VB6 può essere eseguito nell'IDE dopo aver compilato la DLL C# e aggiunta come riferimento al progetto VB6.

Il debug della DLL con l'host VB6 è possibile in Visual Studio compilando il progetto VB6 e utilizzandolo nelle proprietà del progetto come eseguibile da eseguire.

Sfortunatamente, ciò richiederà in anticipo di avere almeno la struttura di ciascun lavoro.

+0

Quando dici: "Il debug del codice VB6 può essere eseguito nell'IDE su proprio dopo la compilazione e il riferimento alla DLL C#." vuoi dire creare l'eseguibile? – Knoxxios

+0

@Knoxxios No, Compilare la DLL. Per eseguire il debug o testare entrambi, è necessario un altro compilato. Da qui la necessità di un quadro di base prima. Ho aggiornato la mia risposta un po 'per chiarire. – Deanna

+0

Oh, in quel caso l'ho già provato. Ho compilato l'assembly C# e l'ho fatto riferimento nel progetto VB6. Posso eseguire il debug della C# dll usando il tuo suggerimento, ma non il progetto VB6. – Knoxxios

9

Questo non è un problema, VB6 usa il proprio debugger che non interferisce con nessun altro debugger, incluso quello gestito per il codice C#.

Si parte dal progetto della libreria di classi C#, assicurarsi che sia selezionato come progetto iniziale. Progetto + Proprietà, scheda Debug. Selezionare l'opzione "Avvia programma esterno" e immettere il percorso per l'IDE VB6. In genere c: \ Programmi \ Microsoft Visual Studio \ vb98 \ vb6.exe. Impostare un punto di interruzione sul metodo che si desidera eseguire il debug.

Premere F5 e il VB6 ide inizieranno a funzionare. Carica o crea il tuo progetto vb6. Tieni presente come puoi aggiungere il percorso al progetto .vbp nel passaggio precedente in modo che esso carichi automaticamente il tuo progetto.

Avviare il debug del progetto vb6 come al solito. Non appena inizia a usare la classe [ComVisible] C#, viene caricato l'assembly C#. E il punto di interruzione verrà colpito quando il codice vb6 chiama il metodo. Passa avanti e indietro secondo necessità. Si noti che non è possibile eseguire il single-step dal codice vb6 al C#, è necessario impostare i breakpoint per arrestare il debugger.

+0

Ciao Hans, ho appena provato la tua soluzione. Errori con "Errore di automazione Il sistema non riesce a trovare il file specificato" NOTA: il file dll .net contiene una classe e metodi [COMVisible (true)]. C'è una copia dell'assembly C# e .tlb nella stessa directory del progetto vb6. E infine, l'assemblaggio .Net è stato compilato utilizzando VS2010. c'è un modo specifico per caricare l'assembly C# in VB6? – Knoxxios

+0

Questa è una domanda completamente diversa, assicurati di chiederla. In breve, il CLR non ha alcun motivo per cercare nella directory del progetto vb6, non ne sa nulla. Sembra nella directory regasm.exe/codebase e nel GAC per l'assembly [ComVisible] e nella directory vb98 e GAC per gli assembly dipendenti. Usa Fuslogvw.exe per vederlo. –

+0

Bello, pensavo fosse possibile ma non l'avevo provato quindi non sapevo come interagiscono, quindi "non facilmente" :) – Deanna

3

Ah, le meraviglie dell'utilizzo di .NET da VB6 in modo debuggabile.

  • nel progetto VB6 Compile options (raggiunti utilizzando il pulsante Opzioni nella finestra di dialogo Crea progetto), scegliere la compilazione di codice nativo , No Ottimizzazione, e Crea simbolici opzioni di debug Info. Quindi compila il tuo progetto VB6. Queste opzioni consentono la corretta mappatura da binario a sorgente VB6.
  • Passare alla pagina Proprietà di configurazione ... Debug della soluzione e modificare Avvia azione per avviare il file eseguibile VB6.
  • In VS Solution Explorer, andare su File ... Aggiungi elemento esistente e navigare fino alla cartella contenente il codice sorgente VB6 che si desidera eseguire il debug. Fare doppio clic sul file del codice sorgente VB6 che si desidera eseguire il debug e aprire in VS una finestra di origine che consenta di impostare i punti di interruzione nel codice sorgente VB6.
  • Assicurarsi che la libreria .NET disponga di un costruttore pubblico predefinito. Questo è essenziale.
  • Ora imposta anche qualsiasi punto di interruzione C# di cui hai bisogno. Fare il passaggio non nel codice .NET - questo non funziona.
  • Quando si avvia il debug con VS, i punti di interruzione VB6 e C# devono essere colpiti normalmente.
+0

Questo purtroppo consente solo il debug della .Net dll – Knoxxios

+0

@Knoxxios, ho aggiunto un punto in più che spiega come eseguire il debug VB6 codice sorgente in dettaglio. – RoadWarrior

+0

Non riesco ad aprire una finestra di origine dove seguo i tuoi passi, spero che non volessi dire che posso aprire il codice VB6 in VS2010. – Knoxxios