Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Membre du Club
    Wrapper - Utiliser une dll C++/CLI avec toutes ses dépendances
    Bonjour,

    Je demande votre aide car je souhaite réutiliser des fonctions d'un projet C++ dans mon projet C#. Pour ce faire, j'ai créé un projet C++/CLI pour wrapper les fonctions C++ dans mon projet C# (C++/CLI est compatible aussi bien C# que C++). Pour ce faire, dans un premier temps j'ai créé des fonctions très simple dans mon projet C++/CLI (sans faire appel à des fonctions c++). J'ai ajouté la DLL C++/CLI dans mes références de mon projet C#.
    Dans mon code C#, je fais appel aux fonctions de ma DLL C++/CLI. Mon projet C# me propose bien les fonctions de ma DLL C++/CLI. En compilant mon projet C# pas à pas, je vois bien que mon code passe par mes fonctions C++/CLI. Jusqu'ici tout va bien.

    Maintenant en compliquant les choses, dans mon projet C++/CLI je souhaite faire appel aux fonctions C++. Pour cela ,j'ai fait appel à un fichier header.h en faisant #include "C:\...\header.h" dans mon C++/CLI. Je recompile mon projet C++/CLI. (Mon projet C# est déjà relié à mon projet C++/CLI par la DLL référencé). Je retourne dans mon projet C# et je recompile pas à pas et là j'ai une erreur :

    "An unhandled exception of type 'System.IO.FileNotFoundException' occurred in myProject.exe
    Additional information: Could not load file or assembly 'Wrapper.dll' or one of its dependencies. Le module spécifié est introuvable."

    Le problème je pense c'est que en faisant mon #include "C:\...\header.h", ce fichier header.h lui même dépend de plein d'autres fichiers. J'ai donc alors un problème de linkage/configuration mais je ne sais absolument pas comment résoudre. Du côté C# ? côté C++/CLI? Comment faire? Quoi faire?

    Merci pour votre aide svp.

  2. #2
    Expert éminent sénior
    Pour quelqu'un qui connait le C++, votre discours et vos tentatives d'explications ne sont pas cohérents.

    Pour cela ,j'ai fait appel à un fichier header.h en faisant #include "C:\...\header.h" dans mon C++/CLI. Je recompile mon projet C++/CLI.
    Inclure un .h n'a jamais inclus du code.
    Ces fonctions C++, elles sont censées être accessibles au code C++/CLI comment ?
    1- copier/coller du code source, .cpp compris ?
    2- c'est que des fonctions template ou inline donc en n'incluant que des .h ?
    3- c'est packager dans une lib statiques ?
    4- c'est packager dans une lib dynamique + Dll ?
    5- Autrement ?

    Si c'est 1, pourquoi ne pas mentionner la récupération des .cpp ?
    Si c'est 2, Ok.
    Si c'est 3 ou 4, il doit avoir un "#pragma comment (lib,...) qui se balade dans le .h pour faire le pont. Et c'est pas un détail.

    L'une des innerExceptions imbriquées doit indiquer quel fichier est manquant.

    Mais, au vu que vous êtes complètement paumé avec des "explications" complètement capilo-tractées, on va commencer par la base :
    Qu'est-ce qui vous fait croire que "S2JLib.exe", s'exécutant dans un working directory que vous ne précisez pas, avec un utilisateur que vous ne précisez pas, à la moindre chance de récupérer dans sa liste des répertoire de recherche de dll ou d'assemblies un répertoire contenant cette Dll, avec un bon numéro de version ?

    Des outils comme process explorer permettent de voir ces chemins de recherches.
    Des outils comme depandancy walker permettent de voir le graphe des dépendances statiques entre Dll.