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).

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top