Come posso usare COM senza reg per un riferimento dll vb6 in un progetto .net?
-
03-07-2019 - |
Domanda
Sto provando a risolvere questo problema da molto tempo e nulla sembra funzionare.
Ho una DLL COM scritta in vb6. Aggiungo un riferimento a questa DLL in .net, con le proprietà 'isolated' e 'copy local' impostate su true sul riferimento. Apparentemente questo dovrebbe abilitare com senza reg.
Ma non funziona. Se provo su un altro computer o annulla la registrazione della DLL con regsvr32, il tentativo di accedere alla DLL genera un'eccezione (essenzialmente dicendo che la classe com desiderata non esiste). I file DLL e manifest si trovano nella stessa cartella di EXE, ma apparentemente li ignora totalmente.
Cosa sto facendo di sbagliato? Ho letto un sacco di articoli sparsi su questo, ma nessuno di loro mi dà una soluzione funzionante. Ho armeggiato con Visual Studio senza risultati. Ho armeggiato una piccola quantità con make-my-manifest, ma non ha funzionato (anche su un progetto di test).
Soluzione
Stavo creando e usando la classe com su un thread non-ui. Apparentemente com-Reg libero su DLL vb6 non funziona in quella situazione. Questo codice di prova lo mostra:
Private Sub RunTest() Handles Button1.Click
Try
Dim x As New RegTestProject.RegTestCall
MsgBox(x.RegTestFunction())
Catch ex As Exception
MsgBox(ex.ToString)
End Try
End Sub
Private Sub RunThreadedTest() Handles Button2.Click
'fails if reg-free COM is used'
Dim t As New Threading.Thread(AddressOf RunTest)
t.Start()
End Sub
Quando eseguo questo con la DLL registrata normalmente, entrambi i test hanno esito positivo. Se uso com senza reg, il test con thread fallisce anche se il test normale ha comunque esito positivo. Sembra che questo sarà un grande dolore per aggirare.
Altri suggerimenti
Sono abbastanza sicuro che quando si fa riferimento ai componenti COM in questo modo, l'importazione dei componenti COM avviene ogni volta che si crea. Ciò significa che il componente COM deve essere registrato nel modo tradizionale su ogni macchina su cui verrà costruito il progetto.
Ecco un link che descrive l'utilizzo della registrazione interoperabilità gratuita. Se l'hai già fatto, pubblica il tuo file manifest. Potresti avere un refuso per la tua scomparsa.
Modifica
Solo un pensiero potrebbe essere più semplice semplicemente registrare la dll la prima volta che l'app viene eseguita su una nuova macchina. L'interoperabilità gratuita per la registrazione è disponibile solo su Windows XP e versioni successive, quindi se il tuo bersaglio è un dinosauro là fuori non funzionerà.
Ecco un estratto dalla Risoluzione dei problemi di una MSDN articolo su COM privo di reg. Mi scuso se l'hai già visto. La buona notizia è che sei già parte del processo. Suggerisce di riprodurre il problema in Windows Server 2003 (forse con Virtual PC ?) e quindi il registro eventi dovrebbe aiutare.
Per prima cosa procedi con il tuo client un server registrato; quindi annullare la registrazione il server e verifica che il tuo errore il messaggio è quello che ti aspettavi; e finalmente ... crea e distribuisci manifest File. In questo modo la risoluzione dei problemi gli sforzi ... saranno limitati al struttura dei file manifest (e l'incorporamento corretto dell'assemblaggio manifest se si sceglie di farlo).
Durante la risoluzione dei problemi senza registrazione Problemi di COM, Visualizzatore eventi attivo Windows Server 2003 è tuo amico ... cerca nel registro eventi di sistema gli eventi dal server COM. Non ti consiglio di guardare Registro eventi di Windows XP ... conterrà invariabilmente a messaggio ... che non aiuta identificare il problema.