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# Discussion :

Utiliser des fonctions C++ dans C# ?


Sujet :

C#

  1. #1
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut Utiliser des fonctions C++ dans C# ?
    Salut

    Je débute en C#. J'utilise VC2008 Express pour l'instant, mais si nécessaire je peux me faire acheter une licence pour VC2008.

    Je voudrais me servir du C# pour faire l'interface graphique d'un programme de traitement d'images, plutôt que d'utiliser en C++ les MFC beaucoup plus compliquées à long terme.
    Mais je dispose déjà des fonctions de traitement d'images en C++.

    Questions:
    -Comment utiliser des fonctions C++ sous C#? par l'édition de lien d'une 'lib' ou 'dll' peut-être?
    -Comment afficher en C# dans une fenêtre les images retournées par les fonctions C++?

    Merci

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut
    C'est assez technique,
    Il faut regarder du coté de System.Runtime.InteropServices. Tu y trouvera des classe pour passer d'une fonction C++ à du code C#

    Chercher sur google DllImport tu trouvera certainement ton bonheur et aussi sur le forum.

    Lien msdn :
    http://msdn2.microsoft.com/fr-fr/net...dc(VS.80).aspx
    La tu aura tout ce qu'il te faut

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Je viens de voir qu'il est également possible de faire un projet de "Form" en C++ avec VC 2008 Express. C'est peut-être préférable pour mon cas, non?

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    141
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 141
    Points : 110
    Points
    110
    Par défaut
    Pas vraiment,
    VS2008 te propose de faire un projet winform en c++ mais en C++ managé! Donc il te faudra forcemment passer par le System.Runtime.InteropServices pour accéder au fonction non managées.
    En gros ca change rien.

    T'en fait pas c'est pas très difficile d'utilisé ce namespace, il faut juste prendre le temps de prototypé les fonctions. Il faut trouver également les correspondance entre type c# et type c++. Mais je suis sur que tu trouvera ton bonheur en posant des questions sur le forum si besion est

  5. #5
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Donc en C++ comme en C#,il faudrait quand même passer par "System.Runtime.InteropServices".
    Ca m'arrangerait quand même en C++, parce que je suis bien plus à l'aise qu'avec la syntaxe C#.

    Ca s'utilise comment "System.Runtime.InteropServices"?

    Et sais-tu comment je pourrais afficher une image (traitée par une fonction C++) dans une fenêtre Windows?

  6. #6
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Salut,
    Voilà un petit tuto pour faire ce que tu veux en C# (avec correspondance de types).
    Pour passer une image, je ne pense pas que ce soit possible directement. A mon avis il faut que tu la passes sous forme d'un tableau de byte.
    Bon courage

  7. #7
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Merci à vous 2.
    Je vais voir le tuto...

    Vous me conseilleriez plutôt de programmer mon IHM en C# ou en C++?

    A mon avis il faut que tu la passes sous forme d'un tableau de byte.
    C'est ce que j'avais grosso modo l'intention de faire. La librairie C++ pouvant retourner un pointeur sur l'image.
    A priori, je pensais utiliser l'outil PictureBox, mais je ne sais pas comment changer l'image affichée.

  8. #8
    Membre extrêmement actif Avatar de fally
    Homme Profil pro
    Développeur .Net / BI
    Inscrit en
    Novembre 2007
    Messages
    966
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations professionnelles :
    Activité : Développeur .Net / BI

    Informations forums :
    Inscription : Novembre 2007
    Messages : 966
    Points : 1 173
    Points
    1 173
    Par défaut
    Citation Envoyé par Charlemagne Voir le message
    Je viens de voir qu'il est également possible de faire un projet de "Form" en C++ avec VC 2008 Express. C'est peut-être préférable pour mon cas, non?
    a toi de voir non?

  9. #9
    Membre éclairé
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Points : 751
    Points
    751
    Par défaut
    Citation Envoyé par Charlemagne Voir le message
    Vous me conseilleriez plutôt de programmer mon IHM en C# ou en C++?
    C'est comme tu préfères (synthaxe, multihéritage ou interface...). Personnellement, ça n'engage que moi, mais je dirais que l'intérêt de faire du C++ managé est relativement limité à part si tu es habitué à la "POO C++" et à sa synthaxe.
    Citation Envoyé par Charlemagne Voir le message
    C'est ce que j'avais grosso modo l'intention de faire. La librairie C++ pouvant retourner un pointeur sur l'image.

    Citation Envoyé par Charlemagne Voir le message
    A priori, je pensais utiliser l'outil PictureBox, mais je ne sais pas comment changer l'image affichée.
    J'ai jamais utilisé, mais ça doit être très simple. Voilà un exemple d'ailleurs.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Citation Envoyé par Charlemagne Voir le message
    Vous me conseilleriez plutôt de programmer mon IHM en C# ou en C++?
    Salut,

    si tu es habitué au C++, fais le en C++, ca serait bete de tout devoir reapprendre. De plus, l'interop C++ managé/C++ natif (IJW toussa) est bien plus simple que C#/C++ natif (DLLImport moins bien).

    Ta form, tu pourras tres bien la faire en C++/CLI (ca reste du .Net in fine). En plus tu auras droit (troll incoming !) d'utiliser la superbe syntaxe du C++/CLI (priceless !). =D

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Le petit tuturiel facilement comment relier du code managé à une DLL.
    Serait-ce possible de le relier avec une LIB statique de façon similaire? (j'en demande peut-être trop...)

    J'avais trouvé un autre exemple dans la doc de Visual, pour afficher l'image que je veux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    private:
       Bitmap^ image1;
       void Button1_Click( System::Object^ /*sender*/, System::EventArgs^ /*e*/ )
       {
          try
          {
     
             // Retrieve the image.
             image1 = gcnew Bitmap( "C:\\Documents and Settings\\All Users\\"
             "Documents\\My Music\\music.bmp",true );
             int x;
             int y;
     
             // Loop through the images pixels to reset color.
             for ( x = 0; x < image1->Width; x++ )
             {
                for ( y = 0; y < image1->Height; y++ )
                {
                   Color pixelColor = image1->GetPixel( x, y );
                   Color newColor = Color::FromArgb( pixelColor.R, 0, 0 );
                   image1->SetPixel( x, y, newColor );
     
                }
     
             }
     
             // Set the PictureBox to display the image.
             PictureBox1->Image = image1;
     
             // Display the pixel format in Label1.
             Label1->Text = String::Format( "Pixel format: {0}", image1->PixelFormat );
          }
          catch ( ArgumentException^ ) 
          {
             MessageBox::Show( "There was an error."
             "Check the path to the image file." );
          }
     
       }

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Citation Envoyé par Charlemagne Voir le message
    Serait-ce possible de le relier avec une LIB statique de façon similaire? (j'en demande peut-être trop...)
    Oui, tu peux, mais il faut passer par Wrapper C++/CLI si tu veux l'utiliser en C#.

  13. #13
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par SirJulio Voir le message
    Oui, tu peux, mais il faut passer par Wrapper C++/CLI si tu veux l'utiliser en C#.
    Je ne comprends pas ce que tu veux dire.
    A priori je vais plutôt programmer l'IHM en C++ managé.

    Concrètement, il faut faire comment pour relier du C++ managé avec une LIB statique C++?

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    My bad.

    J'avais mal lu le code plus haut, je croyais que tu voulais continuer en C#. Pour la theorie, je sais que c'est possible, apres en pratique, je ne pourrais te l'expliquer, donc je passe mon tour (peut etre que tu trouveras des reponses sur le forum C++).

  15. #15
    Inactif  
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    743
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 743
    Points : 460
    Points
    460
    Par défaut
    Merci à tous, vous m'avez bien renseigné.
    Reste plus qu'à mettre en pratique...

  16. #16
    Membre confirmé Avatar de themadmax
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    446
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 446
    Points : 496
    Points
    496
    Par défaut
    Salut,

    J'ai moi meme developpé un soft de traitement d'image en C/C++/ASM, avec une interface graphique en C#/WinForm. Apres avoir fait plusieur essai, je me suis orrienté vers une interop en COM (avec ATL).
    Ce qui permet de faire du C/C++ non manager pour avoir le plus de performance, et de dialoguer assez facilement avec le C#.

    Recherche des articles sur COM interop in C# (codeproject.com aussi)
    ________________________________________________
    http://bliquid.fr : Blog sur Android et l'Acer Liquid

Discussions similaires

  1. utilisation des fonction excel dans VBA
    Par ghosty04 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/04/2009, 11h24
  2. Réponses: 0
    Dernier message: 31/05/2008, 16h27
  3. Réponses: 6
    Dernier message: 07/05/2008, 13h54
  4. Utiliser des fonctions contenues dans un fichier .bas
    Par usbeck dans le forum Visual C++
    Réponses: 4
    Dernier message: 11/08/2006, 12h03
  5. Réponses: 6
    Dernier message: 22/05/2006, 13h54

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