Oggetto sbagliato tornato da COM Callable Wrapper
Domanda
Ho appena fatto un aggiornamento a una DLL che viene chiamato da VBA in PowerPoint. Tutto lo sviluppo è andato bene, ma quando ho cercato di distribuire su un'altra macchina utenti ho un problema che non ho idea di come eseguire il debug.
Quello che succede è che quando l'oggetto .Net viene creato nella VBA, il riferimento che viene restituito è l'oggetto sbagliato, in modo che la riga successiva non riesce con il metodo non trovato.
Dim myObj As Foo.Bar
Public Sub RefreshData()
//'instantiate object
Set myObj = New Foo.Bar
//'call a method
myObj.HelloWorld
L'ultima riga non riesce con Errore di run-time '438' oggetto non supporta questa proprietà o metodo che è causato dal fatto che in qualche modo myObj è di tipo "Wrong.Type" invece di "Foo.Bar".
"Wrong.Type" è anche nel montaggio, in modo da assumere qualcosa sta andando storto con la libreria dei tipi, ma ho provato rigenerante (usando regasm / codebase / TLB MyLib.dll), e questo non ha aiutato.
Non so come diagnosticare questo oltre. Speriamo che qualcuno là fuori può elencare alcuni passaggi su come diagnosticare questo tipo di problema?
Soluzione 2
In questo caso, rimuovendo il riferimento al file TLB, e quindi aggiungendo nuovamente risolto il problema
Purtroppo, non ho mai fatto trovare una soluzione generale, o una spiegazione per il comportamento.
Altri suggerimenti
Potrebbe il problema di GUID generati automaticamente (classe, interfaccia, tipo biblioteca) - quando è stata modificata la DLL, GUID cambiato. Dal momento che la vecchia TLB usato vecchi GUID, facendo riferimento a esso, è legato quei vecchi GUID con nomi tipo, in modo che il codice non è riuscito a lavorare con i nuovi GUID. La maggior parte del codice VB (6 e .NET) ho incontrato ha questo problema, quindi, se la DLL è scritto in VB, è probabilmente (e il vostro lavoro supporta circa questa teoria).
Se questo è il problema, una soluzione generale è quella di impostare GUID in modo esplicito, che è un po 'fastidioso se si dispone di un sacco di tipi, dal momento che si suppone di cambiare GUID come la versione (s) il cambiamento, e si' ll hanno a che fare manualmente.