Compilando l’app VB6 con .NET Interop, viene eseguito solo se compilato sulla mia macchina

Recentemente ho sviluppato un controllo utente interop in .NET (Visual Studio 2008, progetto mirato a .NET 2.0) da utilizzare in un’applicazione VB6. L’assembly espone 1 controllo, 1 class e alcuni enumeri e strutture. L’ho sviluppato utilizzando le traduzioni in C # del modello di progetto Interop Forms Toolkit 2.0 che si trova qui . L’assembly ha un nome forte e viene installato nel GAC e registrato con regasm con il seguente script:

@"C:\gacutil.exe" /i "C:\Program Files\AppName\Control.dll" /f @"C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\regasm.exe" "C:\Program Files\AppName\Control.dll" /tlb:"C:\Program Files\AppName\Control.tlb" 

Il problema: quando compilo l’app VB6 sulla mia macchina, funzionerà perfettamente su qualsiasi altra macchina (controllo installato, ovviamente). Tuttavia, quando l’app viene compilata su una macchina diversa, verrà eseguita su quella macchina, ma non su un’altra macchina. E quando dico che non funziona, voglio dire che cerchi di eseguirlo e assolutamente non succede nulla.

Ho usato OleView per esaminare il controllo sia sulla mia macchina che sull’altra macchina, e tutti i GUID sono uguali nelle informazioni sul tipo. L’unica differenza era che uno aveva la riga importlib (“stdole2.tlb”) e l’altro aveva importlib (“STDOLE2.TLB”).

La mia macchina ha: Visual Studio 6.0 sp6, VB6 modelli di controllo utente interop, Windows SDK 6.0 e 6.0A, Visual Studio 2008 sp1. Questa macchina è quella che funziona.

Macchina per i colleghi: Visual Studio 6.0 sp6, Visual Studio 2005

Un altro computer: Visual Studio 6.0 sp6, Visual Studio 2008. 2008 è stato installato su questa mattina e non ha risolto il problema.

Come faccio a ottenere queste altre macchine per compilare correttamente l’app VB6 in modo che venga eseguita su macchine diverse da quella su cui è stata compilata?

(Metti richieste di ulteriori informazioni nei commenti e io modificherò questo per fornire risposte.)

modifiche:

È stato presentato un suggerimento relativo alle autorizzazioni in relazione alla registrazione del controllo. Mi piacerebbe chiarire che il controllo sembra funzionare bene. Lo registro esattamente allo stesso modo sulla macchina che funziona e su quella che non funziona. Il problema si manifesta quando l’app VB6 che fa riferimento al controllo viene compilata su una macchina diversa dalla mia.

Dovrei anche aggiungere che ho avuto una piccola app host VB6 con 1 modulo e il controllo di interoperabilità e un paio di pulsanti. Questo non presenta lo stesso problema dell’app principale VB6.

Forse un indizio

Se qualcuno ha familiarità con l’utilizzo di OleView.exe, penso che possa aver scoperto un indizio. Quando visualizzo l’elenco Librerie dei tipi, c’è “OrderControl (Ver 0.1)” e “OrderControlCtl (Ver 0.1)”. Il primo utilizza il GUID definito per l’assembly e il percorso mostra OrderControl.tlb generato dall’utilizzo di RegAsm.exe. Il secondo ha GUID diversi sui diversi computer e il percorso sul mio è “C: \ Programmi \ Microsoft Visual Studio \ VB98 \ vbc00305.oca”, il percorso sull’altro computer è “C: \ Programmi \ Microsoft Visual Studio \ VB98 \ mscoree.oca “e sul computer del collaboratore è” C: \ windows \ system32 \ mscoree.oca “. Entrambi mscoree.oca hanno le stesse dimensioni, ma il vbc00305.oca sulla mia macchina è più piccolo di KB.

Ho esaminato nuovamente i riferimenti del progetto VB6. I riferimenti elencano sia OrderControl che OrderControlCtl, ma solo OrderControlCtl è selezionato. La posizione di OrderControl è il file TLB, ma la posizione di OrderControlCtl è il file OCA che è diverso su ogni stazione.

Dipendenza Walker

Ho eseguito i profili in DW per una versione dell’exe compilata sulla mia macchina e una compilata sulla nostra macchina di compilazione (che non verrà eseguita sulla mia). Divergono alle seguenti 2 linee. Entrambi hanno la prima linea, ma quella che continua continua con più chiamate / carichi, mentre quella che non viene eseguita immediatamente inizia a staccare dopo la prima riga qui:

 GetProcAddress(0x7E720000 [SXS.DLL], "SxsOleAut32RedirectTypeLibrary") called from "OLEAUT32.DLL" at address 0x7712A637 and returned 0x7E746129. GetProcAddress(0x7E720000 [SXS.DLL], "SxsOleAut32MapConfiguredClsidToReferenceClsid") called from "OLEAUT32.DLL" at address 0x7712A637 and returned 0x7E745C0D. 

Da allora ho scoperto che aveva a che fare con 3 particolari metodi sul mio controllo che stavano “restituendo” (tramite il parametro ref ) le strutture. Ho finito per utilizzare una soluzione alternativa che prevedeva la restituzione delle classi anziché delle strutture. Ma sono ancora curioso, quindi ho fatto una domanda diversa .

Prova a rimuovere il controllo utente dal modulo nell’app VB6 principale e aggiungilo di nuovo.

Non sono sicuro, ma ho avuto anche problemi del genere. Prova a usare il regasm con / codebase.