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 :

Probleme Wrapper c++ -> C#.


Sujet :

C#

  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Pologne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Par défaut Probleme Wrapper c++ -> C#.
    Salut,

    Je dois faire un wrapper c++ vers c#. J'ai fais un petit example avec une methode qui returne tab double . J'ai le probleme avec declenchement cette methode dans le c#.

    Si c'est possible quel'un peut regarder mon code ?
    Je serai reconnaisante de l'aide

    Mon code dans le c# :
    Form1.cs :
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
     
    namespace WrapperTab
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Run();
            }
     
            public static void Run()
            {
            double[] dane = new double[30];
     
                #region Dane
                dane[0] = 2.3;
                dane[1] = 2.4;
                dane[2] = 4.5;
                dane[3] = 5.5;
                dane[4] = 5.5;
                dane[5] = 6.7;
                dane[6] = 5.6;
                dane[7] = 4.5;
                dane[8] = 5.5;
                dane[9] = 4.4;
                dane[10] = 2.3;
                dane[11] = 2.3;
                dane[12] = 4.5;
                dane[13] = 5.5;
                dane[14] = 5.5;
                dane[15] = 6.7;
                dane[16] = 2.4;
                dane[17] = 4.5;
                dane[18] = 5.5;
                dane[19] = 5.5;
                dane[20] = 6.7;
                dane[21] = 5.6;
                dane[22] = 4.5;
                dane[23] = 5.5;
                dane[24] = 4.4;
                dane[25] = 2.3;
                dane[26] = 2.3;
                dane[27] = 4.5;
                dane[28] = 5.5;
                dane[29] = 5.5;
                #endregion Dane
     
                double[] wynik = new double[30];
                wynik = UnsafeNativeMethods.fun(dane);  // ?????
     
                for (int i = 0; i < 30; i++)
                {
                    MessageBox.Show(wynik[i].ToString());
                }
     
     
           }
        }
    }

    Class1.cs
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
     
    namespace WrapperTab
    {
        internal static class UnsafeNativeMethods
        {
            const string dllLocation = "D:\\TestWrapperTab\\WrapperTab\\WrapperTab\\TestWrapperTab.dll";
            [DllImport(dllLocation)]
            public static extern double[] fun(double[] tab1);
        }
    }
    code in c++ :

    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
     
     #include "stdio.h"
    #include <iostream>
     
    extern "C"
    {
     
    __declspec(dllexport) double* fun(double tab1[30])
    {
    	double tabWyn[30];
     
    	for(int i =0; i<30;i++)
    	{
    		tabWyn[i]=tab1[i] + 5;
    	}
     
    	return tabWyn;
    }
     
    }

    Amicalement
    agatte

  2. #2
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Bonjour, bonsoir.

    La mémoire a été allouée par du code unsafe, elle n'est donc pas gérée par le GC. Donc elle doit faire l'objet d'une libération explicite. Or, ceci n'est pas possible en C# pour un objet tableau, seulement pour un objet IntPtr. Il n'y aurait vraiment aucun moyen d'accomplir cela avec un tableau puisque, comme tout objet managé, les données du tableau C# peuvent être déplacées en mémoire. Cela causerait la perte de l'adresse originale du tableau C++.

    Si vraiment on veut conserver la forme actuelle de la fonction C++, il faut retourner un IntPtr en C#. Puis copier vers un tableau C# via Marshal.CopyTo(...)

    Mais le plus simple est de changer la signature de la fonction c++ en fun(double* source, double* destination). Dans ce cas le tableau aura été instancié en C# et il n'y aura plus de problème.

    Enfin, tu peux aussi tenter de regarder du côté des SAFEARRAY en C++ mais c'est assez lourdingue.

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2011
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Pologne

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2011
    Messages : 12
    Par défaut
    Ok, Merci de ta reponse .
    Je me suis deja debrouille


    J'ai pris une solution comme ca :

    Dans le c# : Form.cs
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
     
     
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
     
    namespace WrapperTab
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
                Run();
            }
     
            public static void Run()
            {
            double[] dane = new double[30];
     
                #region Dane
                dane[0] = 2.3;
                dane[1] = 2.4;
                dane[2] = 4.5;
                dane[3] = 5.5;
                dane[4] = 5.5;
                dane[5] = 6.7;
                dane[6] = 5.6;
                dane[7] = 4.5;
                dane[8] = 5.5;
                dane[9] = 4.4;
                dane[10] = 2.3;
                dane[11] = 2.3;
                dane[12] = 4.5;
                dane[13] = 5.5;
                dane[14] = 5.5;
                dane[15] = 6.7;
                dane[16] = 2.4;
                dane[17] = 4.5;
                dane[18] = 5.5;
                dane[19] = 5.5;
                dane[20] = 6.7;
                dane[21] = 5.6;
                dane[22] = 4.5;
                dane[23] = 5.5;
                dane[24] = 4.4;
                dane[25] = 2.3;
                dane[26] = 2.3;
                dane[27] = 4.5;
                dane[28] = 5.5;
                dane[29] = 5.5;
                #endregion Dane
     
                double[] wynik = new double[30];
                IntPtr pwynik = Marshal.AllocHGlobal(30 * 8);
                UnsafeNativeMethods.fun(dane, pwynik);
                Marshal.Copy(pwynik, wynik, 0, 30);
                for (int i = 0; i < 30; i++)
                {
                    MessageBox.Show(wynik[i].ToString());
                }
     
                Marshal.FreeHGlobal(pwynik);
     
     
     
     
           }
        }
    }
    C# Class.cs
    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
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
     
    namespace WrapperTab
    {
        internal static class UnsafeNativeMethods
        {
            const string dllLocation = "D:\\TestWrapperTab\\WrapperTab\\WrapperTab\\TestWrapperTab.dll";
            [DllImport(dllLocation)]
     
            public static extern void fun(double[] tab1, IntPtr pwynik);
        }
    }

    Dans le c++ :

    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
     #include "stdio.h"
    #include <iostream>
     
    extern "C"
    {
     
    __declspec(dllexport) void __stdcall fun(double tab1[30], double *tabWyn)
    {
     
    	for(int i =0; i<30;i++)
    	{
    		tabWyn[i]= tab1[i] + 5;
    	}
     
     
    }
     
    }

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Penses à passer ton message en résolu si c'est le cas
    Voir le bouton

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de rafraichissement d'un BDGrid
    Par marmotte dans le forum Bases de données
    Réponses: 10
    Dernier message: 28/05/2004, 18h07
  2. Réponses: 2
    Dernier message: 30/05/2002, 08h54
  3. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01
  4. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50
  5. [Kylix] Probleme de nombre flottant!!
    Par yopziggy dans le forum EDI
    Réponses: 5
    Dernier message: 02/05/2002, 10h13

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