IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C++/CLI Discussion :

Utiliser une librairie C# en C++


Sujet :

C++/CLI

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Utiliser une librairie C# en C++
    Bonjour tout le monde,

    Je fais suite ici à un post que j'avais ouvert il y a quelques mois sur le forum C#
    Ayant été pris par d'autres occupations depuis je viens juste de me repencher sur la question.

    Brièvement voici mon problème:
    Je développe un logiciel en C++ avec Qt et sous VS2010. Je possède une librairie écrite en C# dont je possède le code source et que je veux utiliser dans mon programme C++

    Suite à mon précédent post sur le forum C# j'ai créé un petit programme C++ qui utilise cette librairie via la prise en charge du CLR (j'ai juste paramétré mon projet VS en prenant en charge le /clr et en faisant un #using<maLibrairieC#> dans mon code). Ca compile et fonctionne nickel.

    Le soucis vient quand j'essaye de faire la même chose dans mon logiciel avec Qt. Pour le développer j'ai "intégré" Qt à VS2010 et je génère donc un Makefile avec VS qui compile avec QMake (j'ai pas bien compris toutes ces étapes de makefile, .pro, etc. mais peu-importe ça marche )

    Lorsque je lance la compilation en incluant la librairie à ce projet Qt, VS me dit qu'il faut que je prenne en charge le /clr
    Je fais donc comme précisé ici (modif du .pro) sauf que même si ça compile (avec pleins d'avertissement) et que j'arrive à utiliser brièvement les fonctions de ma librairie C#, l'interface bug complètement et ferme sur une erreur.

    J'ai fouillé un peu et apparemment Qt (et plutôt qmake) n'est vraiment pas fait pour fonctionner avec du .NET ou du code managé.

    Le net est pas vraiment fourni en tutoriel/explication à ma portée pour utiliser une librairie C# dans un code C++ (et encore moins avec Qt). J'ai trouvé que des explications pour inclure du C++ dans du C#

    Alors ma question c'est: je me demande s'il est possible d'écrire ma propre librairie en C++/CLI dans laquelle je pourrais utiliser la librairie C# et y réécrire des fonctions faisant des appels simples aux méthodes du C# dont j'ai besoin. Du coup j'aurais une librairie qui serait écrite en C++ qui elle même ferait appel à la librairie C#. J'incluerais cette librairie dans mon projet C++/Qt pour pouvoir compiler sans erreur.
    Est ce que je dis est absurde? et est ce que c'est faisable?

    Sinon quelqu'un aurait une idée ou des conseils/liens pour m'aider à faire ça?

    Merci à tous
    A+

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le seul moyen d'utiliser en C++ natif une bibliothèque .Net, c'est via COM (Component Object Model). Si la bibliothèque C# n'est pas à la base prévue pour ça, tu devras en effet écrire une bibliothèque en n'importe quel langage managé (C++/CLI, VB.Net, C#) qui elle sera exposée via COM ("COM-Visible").

    Je sais qu'il y a quelque part sur dvp un tuto pour appeler .Net depuis C, mais je ne le retrouve pas.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci pour la réponse

    Citation Envoyé par Médinoc Voir le message
    Si la bibliothèque C# n'est pas à la base prévue pour ça, tu devras en effet écrire une bibliothèque en n'importe quel langage managé (C++/CLI, VB.Net, C#) qui elle sera exposée via COM ("COM-Visible").
    J'ai moyen de recréer la biblio, notamment en ajoutant dans les propritétés un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [assembly: ComVisible(true)]
    Pour le moment c'était sur "false". Est ce que changer ça c'est suffisant pour que ça fonctionne avec la suite?
    Je pense que oui vu que la lib est commentée comme suit (Mais c'est pour être sur )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Setting ComVisible to false makes the types in this assembly not visible
    // to COM components.  If you need to access a type in this assembly from
    // COM, set the ComVisible attribute to true on that type.
    Et pour la suite quelle est la procédure pour utiliser ce "COM" avec mon code Qt/C++?
    Je vais fouiller de mon côté pour me renseigner la dessus mais si tu pouvais m'éclairer sur les grandes lignes ça m'aiderait à savoir ce que je dois chercher

    Citation Envoyé par Médinoc Voir le message
    Je sais qu'il y a quelque part sur dvp un tuto pour appeler .Net depuis C, mais je ne le retrouve pas.
    Comme toujours je suis preneur de tout tutoriel sur le sujet, si vous avez quelques liens...

    Merci encore !

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Citation Envoyé par Aezer Voir le message
    J'ai moyen de recréer la biblio, notamment en ajoutant dans les propritétés un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [assembly: ComVisible(true)]
    Pour le moment c'était sur "false". Est ce que changer ça c'est suffisant pour que ça fonctionne avec la suite?
    Je pense que oui vu que la lib est commentée comme suit (Mais c'est pour être sur )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // Setting ComVisible to false makes the types in this assembly not visible
    // to COM components.  If you need to access a type in this assembly from
    // COM, set the ComVisible attribute to true on that type.
    Ce commentaire est présent partout, il est généré par Visual. Le régler à true ne suffira pas pour rendre ses classes utilisables: Il faudra leur donner des GUID toi-même* car sinon c'est PITA de connaître ceux générés par Visual, et peut-être devoir faire des trucs au niveau des interfaces (je ne suis plus certain de comment ça marche de ce côté).

    Et pour la suite quelle est la procédure pour utiliser ce "COM" avec mon code Qt/C++?
    Je vais fouiller de mon côté pour me renseigner la dessus mais si tu pouvais m'éclairer sur les grandes lignes ça m'aiderait à savoir ce que je dois chercher
    Sous Windows à la base, on utilise des fonctions comme CoCreateInstance(), ou des classes templates comme CComPtr<> (MFC), _com_ptr_t<> (Compiler COM Support); j'ignore si QT possède des classes spécifiques.

    *Il y a deux outils pour créer des GUIDs qui sont livrés avec certaines versions de Visual et qui doivent être disponibles en DL: uuidgen (en ligne de commande) et guidgen (fenêtré).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2012
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Ok ok... merci pour les précisions.
    Bon bin je crois que ça va être plus simple de réécrire la bibli en C++

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/04/2006, 17h44
  2. Utiliser une librairie license LGPL
    Par Elbarto dans le forum Licences
    Réponses: 1
    Dernier message: 12/11/2005, 22h58
  3. Utiliser une librairie
    Par BugFactory dans le forum API standards et tierces
    Réponses: 7
    Dernier message: 11/10/2005, 16h24
  4. Creer et utiliser une librairie externe à l'exécutable
    Par multani dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 06/11/2003, 10h11
  5. Utiliser une librairie graphique
    Par Troopers dans le forum Linux
    Réponses: 6
    Dernier message: 22/08/2003, 11h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo