Registrazione gratuita COM senza copiare la DLL nella stessa directory dell'eseguibile

StackOverflow https://stackoverflow.com/questions/6393865

  •  29-10-2019
  •  | 
  •  

Domanda

Come posso utilizzare un oggetto COM senza registrazione senza copiare la dll nella stessa directory dell'eseguibile? È possibile?

Vorrei un esempio funzionante completo o una guida dettagliata passo passo per il mio scenario esatto.

Ad esempio, ho i seguenti componenti:
CppTestRunner.exe - applicazione console vc ++
CppTests.dll - vc ++ mfc dll
CsCOMServer.dll - dll visibile COM c #

Non voglio modificare l'exe o la sua directory, come l'aggiunta di un manifest esterno.
CppTests.dll si trova in una directory diversa dall'exe.
Va bene se CsCOMServer.dll si trova nella stessa directory di CppTests.dll.

CppTestRunner.exe chiama LoadLibrary su CppTests.dll che funziona bene.

Dopo aver incorporato i manifesti e utilizzando le API del contesto di attivazione di Windows, sono stato in grado di copiare CsCOMServer.dll nella directory exe per verificare che CppTests.dll possa creare un'istanza di CsCOMServer.dll senza problemi, ma ancora una volta, sto provando a evitare questo passaggio.

Attualmente, con CsCOMServer.dll nella stessa directory di CppTests.dll e senza CsCOMServer.dll nella directory exe, ricevo il seguente errore quando chiamo CoCreateInstance:
Errore= 0x80070002 Il sistema non riesce a trovare il file specificato.

Ho utilizzato il monitor di processo sysinternals per rintracciare i percorsi in cui CppTestRunner.exe cerca, ecc.
Noto che a seconda delle cose che provo a fare, a volte CppTestRunner.exe cerca di leggere CsCOMServer.dll.config nella stessa directory di CppTests.dll, ma non importa cosa provo a inserire lì, non sono stato in grado di ottenere passato l'errore.
Inoltre, a seconda di altre cose che provo a fare, CppTestRunner.exe prova a leggere CsCOMServer.dll nella stessa directory di CppTests.dll ma per qualche motivo ricevo ancora lo stesso errore.

Qualcuno sa di lavorare sul codice con questo scenario esatto?

Come probabilmente puoi vedere, questo fa parte di alcuni test di integrazione \ unità.

Come semplice soluzione alternativa, sto attualmente copiando CppTestRunner.exe nella stessa directory di CppTests.dll e lo sto eseguendo da lì, ma vorrei evitare questo passaggio.

Grazie.

È stato utile?

Soluzione

.NET cerca la COM gestita senza registrazione prima nella GAC, poi nella cartella dell'eseguibile.Utilizza il contesto di attivazione per leggere i metadati di attivazione, ma non per determinare la posizione dei file stessi.

Altri suggerimenti

Puoi salvare la DLL in una sottocartella, diciamo Cartella DLL \ YourDll.dll , e nel file manifest della tua DLL, scrivi il nome del file come

<file name = "DLLFolder\YourDll.dll">

Ma è necessario mantenere il file manifest (della DLL) nella posizione in cui viene salvato l'EXE.

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