2009-07-29 20 views
7

È possibile forzare un assembly di interoperabilità a fare riferimento a una copia locale della DLL COM associata?Forza .NET Interop per utilizzare la DLL COM locale

Ecco lo scenario:

Ho un'applicazione .NET che fa riferimento a un assembly di interoperabilità (Interop.OTAClient.dll), che è l'interoperabilità per una DLL COM (OTAClient.dll, che è l'API di automazione per HP Quality Center). Non sono molto ben informato su COM, ma, a quanto ho capito, l'assembly di interoperabilità cerca le classi COM tramite i riferimenti GUID nel registro, piuttosto che puntare a un file specifico.

Il problema è che la copia di OTAClient.dll che le chiavi del Registro di sistema puntano a viene sovrascritta da versioni diverse a seconda di quale versione di QC ho appena effettuato l'accesso in un browser e le diverse versioni di queste DLL non sono compatibili tra loro. L'app .NET si collegherà solo a una versione specifica di QC, quindi non posso avere la DLL COM che varia in questo modo.

Qualsiasi suggerimento sarebbe molto apprezzato, in quanto questo comportamento è davvero irritante. Ho visto altre domande sui problemi di interoperabilità di COM, ma sembra che si tratti di forzare una versione locale della DLL di interoperabilità da utilizzare invece di una nella GAC, piuttosto che questo particolare scenario che riguarda la DLL COM effettiva.

risposta

5

Si desidera Registration-free COM.

+0

Ciao Pavel. Grazie per il collegamento: ho seguito l'esempio e VS ha generato la voce manifest per OTAClient come previsto.Tuttavia, vedo ancora gli stessi sintomi se la versione più recente della DLL è stata utilizzata per ultima dall'app browser che utilizza anche quella DLL. Pensi che sia possibile che OTAClient abbia le sue dipendenze che vengono anche sovrascritte con le nuove versioni? Se sì, qualche suggerimento su come potrei gestirlo? – Xiaofu

+0

Potrebbe essere possibile che tali dipendenze siano esse stesse componenti COM. In tal caso, dovresti gestirli in un modo simile (in modo da ottenere una serie di librerie autosufficienti). –

10

Pavel mi ha indirizzato nella giusta direzione, quindi segnerò il suo come risposta. A beneficio di tutti gli altri, ecco quello che ho fatto:

  1. aggiunto un riferimento all'originale OTAClient.dll e lasciare Visual Studio generare la libreria di interoperabilità.
  2. Fare clic con il tasto destro del mouse sulla libreria di riferimento in Esplora soluzioni e fare clic su Proprietà. Quindi imposta Isolato su True. Questo fa sì che VS generi un file manifest indicando al tuo programma di cercare localmente la tua libreria COM invece che quella elencata nel registro.
  3. Specifico per il mio scenario - Ho anche dovuto fare riferimento a WebClient.dll da Quality Center e impostare Isolated to True anche per quello. Questo non viene utilizzato direttamente dalle app che utilizzano l'API OTA, ma sembra essere referenziato da OTAClient.dll.

In questo modo, è possibile accedere e uscire da istanze QC le cui versioni differiscono da quelle utilizzate dall'app senza interruzioni. Nel mio caso, ho un'istanza QC locale v9 e utilizzata per l'automazione specifica del progetto (per vari motivi, è fortemente personalizzata per soddisfare le nostre esigenze, ha molto spazio per la memorizzazione degli screenshot, ecc.) E alla quale si collega la mia applicazione. Tuttavia, per il test manuale devo anche effettuare il login usando in IE un'istanza v9.2 che si trova altrove. Se avessi già effettuato l'accesso all'istanza v9.2, avrei quindi dovuto aprire l'istanza di v9 in IE e lasciarlo scaricare di nuovo i controlli prima di eseguire nuovamente l'app ... e ora non lo faccio. :)

1

Un piccolo esempio che mostra come Web.config cambia dopo aver impostato la proprietà Isolata su true, aiuterebbe gli altri a capire cosa sta accadendo in realtà quando impostiamo la proprietà Isolated su true. VS inserisce effettivamente poche righe nel codice, in modo che utilizzi com Dll di CLSID specifico.

Attualmente ho due applicazioni .Net sullo stesso server, in cui un'applicazione utilizza Quality Center 10.0 Dll e Other è aggiornata al centro di qualità ALM 11.0. Quindi sullo stesso server non possiamo registrare una DLL con lo stesso nome.