Enregistrement gratuit com sans copier la DLL dans le même répertoire que l'exécutable

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

  •  29-10-2019
  •  | 
  •  

Question

Comment puis-je consommer un objet COM gratuit d'enregistrement sans copier la DLL dans le même répertoire que l'exécutable? Est-ce possible?

Je voudrais un échantillon de travail complet ou un guide détaillé étape par étape pour mon scénario exact.

Par exemple, j'ai les composants suivants:
CppTestrunner.exe - Application de console VC ++
Cpptests.dll - DLL VC ++ MFC
Cscomserver.dll - c # com visible dll

Je ne veux pas modifier l'EXE ou son répertoire, comme l'ajout d'un manifeste externe.
Cpptests.dll est dans un répertoire différent de l'EXE.
Il est bon si cscomserver.dll est dans le même répertoire que cpptests.dll.

CppTestrunner.exe appelle LoadLibrary sur cpptests.dll qui fonctionne bien.

Après avoir intégré des manifestes et en utilisant les API de contexte d'activation Windows, j'ai pu copier cscomserver.dll au répertoire EXE pour vérifier que cpptests.dll peut créer une instance de cscomserver.dll sans problèmes, mais encore une fois, j'essaie d'éviter cette étape .

Actuellement, avec cscomserver.dll dans le même répertoire que cpptests.dll, et sans cscomserver.dl
ERROR = 0x80070002 Le système ne peut pas trouver le fichier spécifié.

J'ai utilisé Sysinternal Process Monitor pour retrouver les chemins que CppTestrunner.exe regarde, etc.
Je remarque que selon les choses que j'essaie de faire, parfois CppTestrunner.exe essaie de lire cscomserver.dll.config dans le même répertoire que cpptests.dll, mais peu importe ce que j'essaie de mettre là-dedans, je n'ai pas pu obtenir passé l'erreur.
Selon d'autres choses que j'essaie de faire, cppTestrunner.exe essaie de lire cscomserver.dll dans le même répertoire que cpptests.dll mais pour une raison quelconque, j'obtiens toujours la même erreur.

Quelqu'un connaît le code de travail avec ce scénario exact?

Comme vous pouvez probablement le voir, cela fait partie de certains tests d'unité.

En tant que simple solution de contournement, je copie actuellement cppTestrunner.exe au même répertoire que cpptests.dll et je l'exécute à partir de là, mais je voudrais éviter cette étape.

Merci.

Était-ce utile?

La solution

.NET recherche d'abord le COM sans inscription géré dans le GAC, puis dans le dossier de l'exécutable. Il utilise le contexte d'activation pour lire les métadonnées d'activation, mais pas pour déterminer l'emplacement des fichiers eux-mêmes.

Autres conseils

Vous pouvez enregistrer la DLL dans un sous-dossier, laissez dire Dllfolder youdll.dll, et dans le fichier manifeste de votredll, écrivez le nom de fichier comme

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

Mais vous devez conserver le fichier manifeste (de la DLL) à l'endroit où l'EXE est enregistré.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top