2017-06-28 4 views
0

J'ai une application WPF, que je compile en tant que composant COM dll et que j'installe en utilisant installshieldLE, mais j'ai quelques problèmes avec certaines DLLs dépendantes, lors de l'exécution de mon client COM.Application COM référencée dlls dépannage

Mon dll WPF référence deux autres dll C# (A & B) qui résident dans la même solution VS2012.

Mon fichier WPF dll a vérifié le registre pour l'option COM Interop et fournit une interface COM pour exécuter l'application GUI WPF.

J'ai un programme client C COM qui teste l'application WPF. Le problème que je rencontre est que j'ai besoin d'inclure certaines DLL référencées par dll_A, (qui est un paquetage graphique tiers) dans le dossier du programme client pour que l'application fonctionne correctement. Je n'ai pas besoin d'inclure dll_A ou dll_B dans le répertoire client local.

De plus, il existe d'autres DLL (C) référencées par la DLL du serveur COM et incluses dans l'installation, qui n'ont pas besoin d'être présentes dans le répertoire client, ce qui est difficile à comprendre. Je suppose que ce n'est pas une question WPF mais simplement une question sur l'installation du serveur COM par rapport à d'autres assemblages référencés.

J'ai sorti des messages de débogage dans les DLL principales qui confirment que les dlls A & B, ainsi que la DLL principale COM sont exécutées depuis l'emplacement d'installation. Mais j'obtiens des exceptions plus loin sur la ligne quand les dlls tiers sont manquants dans le dossier client local.

Quelqu'un peut-il m'aider à résoudre ce problème s'il vous plaît. Je peux exécuter le programme client avec succès à partir de l'emplacement d'installation et je suis donc certain que tous les assemblys et dll requis sont présents.

Merci.

Répondre

0

Le problème a été provoqué par la compilation de l'une des DLL référencées en utilisant .Net 4.0, tandis que les autres ont été compilés à l'aide du client .Net 4.0. La recompilation avec le client .Net 4.0 a résolu le problème.

Le problème semblait se produire lors de l'exécution de l'application en tant que composant com enregistré, le client étant exécuté à partir d'un emplacement différent. Si les DLL incriminées ont été copiées dans le répertoire client, tout fonctionne bien.

0

Il semble que vous rencontriez des problèmes liés au chemin de chargement DLL. Une application cliente peut charger votre DLL COM, mais votre DLL COM ne peut pas charger ses propres dépendances (ou dépendances de dépendances, etc.) même si les dépendances existent dans le même dossier que la DLL COM. Est-ce correct?

Si tel est le cas, je crois que ce problème peut être résolu par un appel à la fonction AddDllDirectory - demandez à votre DLL COM de l'appeler avant de charger l'une de ses dépendances et appelez RemoveDllDirectory quand c'est fait. Pour plus d'informations, reportez-vous à la section Remarques de la documentation pour LoadLibrary.

+0

Oui, vous avez raison. Je vais étudier la fonction SetDllDirectory. Merci pour votre contribution. – user5265160

+0

@ user5265160: Il me semble que AddDllDirectory/RemoveDllDirectory sont meilleurs que SetDllDirectory. Réponse mise à jour –

+0

Merci pour les commentaires. C'est utile à savoir. Mon problème était lié à COM/.Net. L'une des dll dépendantes a été compilée en utilisant .Net 4.0, tandis que les autres ont été compilées en utilisant l'édition client .Net 4.0. Cela semble être correct lorsque les DLLs dépendantes sont dans le même répertoire que le client COM mais pas quand ils sont dans la DLL du serveur COM. – user5265160