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 :

créer une fonction de callback entre DLL C++/cli et C#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut créer une fonction de callback entre DLL C++/cli et C#
    Bonjour à vous,
    je bloque actuellement sur le problème suivant : je dispose d'une dll écrite en c++ CLI qui référence une DLL écrite en c#. La première appelle des méthodes statiques de la seconde pour exécuter certaine tâches. jusque là tout fonctionne correctement, mais j'ai besoin maintenant que la dll c# puisse disposer elle même rappeler une méthode de ma library C++/CLI (une sorte de callback). Pour rappelle le shéma est le suivant :
    DLL C++/CLI ===connait/référence==> DLL C#
    mais l'iunverse n'est pas vrai et je désire que la DLL C# puisse disposer d'une sorte de pointeur de fonction et/ou délégué pointant sur une méthode statique de ma library C++/CLI....
    Cela fait quelque jour que j'essaye sans succès d'arriver à mes fins
    Est-ce que quelqu'un pourrait m'aider ou me guider vers un tuto/exemple.
    En vous remerciant par avance,
    Et Bonne année à tous

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    utilise un delegate

  3. #3
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Bonsoir,
    merci pour ta réponse : j'ai essayé effectivement de voir du côté des delegate mais tous les exemples que je trouves portes sur des délégués utilisés par une seule classe ou en tout cas dans le même assembly.
    De plus ma DLL c# ne possède aucune référence à la dll c++/cli : elle ne sait pas qui la consomme : si un delegate est approprié dans ce cas, je ne vois pas comment faire ? Si tu as une piste je suis preneur ;-)
    Merci encore,
    Lek.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Ben ça dépend de quels paramètres la fonction C++ appelée a besoin... Si le type de ces paramètres est défini dans la DLL C++, c'est gênant, mais sinon la DLL C# n'a pas besoin de référencer la DLL C++.

    Regarde par exemple les évènements en Windows Forms : un bouton est capable d'appeler une méthode définie dans ton code, et pourtant Windows Forms ne référence évidemment pas ton programme... Les évènement sont un cas particulier d'utilisation des delegate.

    En gros, il faut que tu définisses dans la DLL C# un delegate public dont la signature correspond à celle de la fonction C++, et que la DLL C++ indique à la DLL C# la fonction de callback à utiliser, via ce delegate.

    Un exemple pour clarifier :

    Code C# : 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
    // déclaration du delegate
    public delegate void TotoCallback(string arg);
    ...
    public class UneClasseCSharp
    {
    ...
     
    // Callback (qui doit être assigné par la DLL "consommatrice")
    public TotoCallback Callback;
     
    ...
     
    // Appel du callback
    if (Callback != null)
        Callback("blabla");
     
    ...
     
    }

    Code C++ : 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
     
     
    ref class UneClassCpp
    {
     
    // fonction C++/CLI qui doit être appelée par C#
    void Toto(String^ arg)
    {
        ...
    }
     
    ...
     
    // Affectation de la fonction au callback
    UneClasseCSharp^ x = gcnew UneClasseCSharp();
    x->Callback = gcnew TotoCallback( this, &UneClassCpp::Toto);
     
    ...
     
    }

    (Y a pt-être qq erreurs dans le code C++, j'ai plus trop l'habitude de C++/CLI...)

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2008
    Messages : 217
    Par défaut
    La réponse de tomlev est parfaitement bonne.

    Je me permets seulement d'ajouter :

    Citation Envoyé par tomlev Voir le message
    Si le type de ces paramètres est défini dans la DLL C++, c'est gênant, mais sinon la DLL C# n'a pas besoin de référencer la DLL C++.
    ... c'est à peine génant en fait, car la solution naturelle est connue : il suffit de déporter les termes-types "fournisseurs" de ladite signature du delegate (dans le cas typique : juste le delegate lui même, et seulement les quelques types qui lui sont spécifiques, avec le type ou namespace englobant) dans un 3eme assembly qu'on pourrait qualifier "d'assembly de contrat", et qui sera donc simplement référencé par votre "assembly C++/CLI" ainsi que par votre autre "assembly C#".

    Pour ce 3eme assembly, si le besoin de l'existence de celui ci se fait sentir, vous choisirez probablement votre langage préféré, C++/CLI plutôt que C#, apparemment, l'intellisense pour la syntaxe C# fera le reste pour vous (merci .NET / l'EDI, etc ).

    Bonne année 2009.

    'HTH

  6. #6
    LEK
    LEK est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    715
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 715
    Par défaut
    Merci à vous deux!
    Cela fonctionne effectivement comme prévu et je pense que je vais replancher sur les délégués pour mieux appréhender le fonctionnement!
    J'ai juste du effectuer une petite modification dans le code C++ : la méthode callback (UneClassCpp::Toto) à rappeler a du être définie comme méthode statique de la classe et l'affectation de la fonction au callback a due être fait ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    x->Callback = gcnew TotoCallback(  &UneClassCpp::Toto);
    mais à part ces petits ajustement cela fonctionne du tonnerre ;-)
    Merci encore à vous,
    Bonne et heureuse année!

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

Discussions similaires

  1. Comment créer une fonction d'archivage des entrées
    Par vietzims dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/05/2008, 23h15
  2. Créer une Fonction recherche sur Access
    Par remwideco dans le forum Access
    Réponses: 4
    Dernier message: 30/01/2006, 10h36
  3. créer une fonction avec parametre optionnel
    Par maximenet dans le forum Langage
    Réponses: 2
    Dernier message: 29/01/2006, 20h51
  4. Réponses: 6
    Dernier message: 10/08/2005, 11h36
  5. Créer une fonction mathématique pendant l'exécution
    Par zeprogrameur dans le forum Langage
    Réponses: 5
    Dernier message: 09/07/2004, 11h36

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