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 :

utilisation d'une classe C/C++ dans du C#


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Nicopilami
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Par défaut utilisation d'une classe C/C++ dans du C#
    Salut à tous, je souhaite utiliser une classe C++ dans un projet C# (asp.net);
    Visual Studio ne veut pas ajouter la ref à la DLL (ce serait trop simple), donc je cherche à le faire manuellement;

    Dans VS, j'arrive à ouvrir ma DLL avec l'explorateur d'objet, et je vois la fonction qui m'interesse:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Function RSAGetUserName() As String
        Membre de RSACOOKIEAPILib.RSACookie
        method RSAGetUserName
    Cependant, j'ai tenté le dllimport de la façon suivante, mais il ne trouve pas l'entrypoint.

    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
     
    namespace xxxxxx
    {
     
        public class RSACookie
        {
            [DllImport("rsacookieapi.dll", EntryPoint = "RSACOOKIEAPILib.RSACookie")]
            public static extern String RSAGetUserName();
        }
     
                       //c'est de l'asp.net, 
                    //d'où l'heritage de System.Web.UI.Page
     public partial class _Default : System.Web.UI.Page
        {
     
            protected void Page_Load(object sender, EventArgs e)
            {
                try
                {
     
                    //c'est de l'asp.net, 
                    //mais on peut remplacer par des Console.WriteLine(...)
                    Response.Write("<li>" + RSACookie.RSAGetUserName() + "</li>");
     
     
                }
                catch (Exception ex)
                {
                    //on peut remplacer par des Console.WriteLine(...)
                    Response.Write("<h3>" + ex + "</h3>");
                }
     
            }
        }
    }
    pouvez vous m'aider ??? je me prends la tête depuis des heures sans succès...

    System.EntryPointNotFoundException: Unable to find an entry point named 'RSACOOKIEAPILib.RSACookie' in DLL 'rsacookieapi.dll'. at xxxxxx.RSACookie.RSAGetUserName() at xxxxxx._Default.Page_Load(Object sender, EventArgs e)
    bye
    Nico

  2. #2
    Membre averti
    Profil pro
    Développeur C#, Python, dans la carte à puce
    Inscrit en
    Mars 2009
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C#, Python, dans la carte à puce
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2009
    Messages : 46
    Par défaut
    Je ne suis pas trop sûr de moi, mais RSACOOKIEAPILib.RSACookie est-il le nom de la méthode C++ que tu veux utiliser ? Ou serai-ce plutôt RSACOOKIEAPILib.RSACookie.RSAGetUserName ?
    Il me semble que l'entry point doit bien définir le nom de la fonction dans la dll, pas juste son espace de nom.
    L'attribut EntryPoint te permet de donner un autre nom en c# à ta fonction, en spécifiant à quel membre de la dll cette déclaration de méthode est-elle ratachée.

  3. #3
    Membre éclairé Avatar de Nicopilami
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Par défaut
    Citation Envoyé par gwenBZH Voir le message
    Je ne suis pas trop sûr de moi, mais RSACOOKIEAPILib.RSACookie est-il le nom de la méthode C++ que tu veux utiliser ? Ou serai-ce plutôt RSACOOKIEAPILib.RSACookie.RSAGetUserName ?
    Il me semble que l'entry point doit bien définir le nom de la fonction dans la dll, pas juste son espace de nom.
    aucune idée

    Citation Envoyé par gwenBZH Voir le message
    L'attribut EntryPoint te permet de donner un autre nom en c# à ta fonction, en spécifiant à quel membre de la dll cette déclaration de méthode est-elle ratachée.
    ok, j'essaierai lundi matin, merci, je vous tiens au courant

    bye
    Nico

  4. #4
    Membre éclairé Avatar de Nicopilami
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Janvier 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Janvier 2009
    Messages : 354
    Par défaut
    même resultat :'(

  5. #5
    Expert confirmé

    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2006
    Messages
    3 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Septembre 2006
    Messages : 3 580
    Par défaut
    il faut regarder du cote de l'interop

    et au pire, faire un wrapper C++/CLI pour accéder à ta (tes) classe(s) C++ depuis du C#....

    En C#, on ne peut accéder qu'à des fonctions C exportées et dont tu connais, bien sur le prototype (il s'agit du mécanisme d'interopérabilité).

    Sinon, plein d'exemples pour le wrapper existent.

    De toute façon, utiliser du C et ou du C++ en C#, se fait très facilement mais parfois, il faut "prendre" un peu de temps pour le faire !!!

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 103
    Par défaut
    Dans son cas l'interopérabilité à laquelle tu fait référence est ce qu'on appel du P/INVOKE.
    Il ne faut pas trop mélanger les concepts, cela n'a absolument rien avoir avec le COM Interop.
    D'ailleurs C++/CLI n'a rien non plus avoir avec les COM Interop.

    Faire le wrapper en C++/CLI ne l'aidera guère plus, sauf avec des méthodes pour le moins exotiques en utilisant comme un gros sauvage l'API Windows et le chargement natif de DLL et en faisant une méthode managée qui appel cette ressource non managée.
    Je ne suis pas convaincu qu'il faille qu'il procède de la sorte, car c'est un peu comme sortir un char d'assaut pour tuer une mouche... D'autant plus que cette méthode est à pour le moins complexe, et que rien ne te garantie, qu'il sache écrire en C++ et encore moins en C++/CLI.

    Il ne faut pas oublier une chose.
    Les DLL natives n'exposent en aucune façon des classes, mais les différentes méthodes des classes, et c'est là le problème. Si la DLL n'exporte pas des fonctions hors classes, tu ne peux pas les appeler, et même les appeler en c++ serait à tout le moins risqué, sans avoir les headers et librairies associées.
    En gros si tu a juste la DLL sans rien d'autres, comme les headers pour l'utiliser si tu la lie à ton exécutable, ce n'est même pas la peine de s'aventurer à faire un wrapper en C++/CLI.

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

Discussions similaires

  1. [Débutant] Utilisation d'une classe dans une servlet
    Par stokoma1981 dans le forum Servlets/JSP
    Réponses: 9
    Dernier message: 28/09/2006, 15h11
  2. Réponses: 4
    Dernier message: 25/07/2006, 16h30
  3. Utilisation d'une classe dans un autre fichier
    Par melotron dans le forum Général Python
    Réponses: 1
    Dernier message: 09/07/2006, 13h11
  4. [POO] Utilisation d'une classe dans une classe !
    Par Okinou dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 14h34
  5. Réponses: 4
    Dernier message: 08/11/2005, 15h10

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