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 :

Importation et utilisation d'une DLL


Sujet :

C#

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut Importation et utilisation d'une DLL
    Bonjour à tous,

    Je suis en train de faire un projet en C#, sous Visual Studio 2010 Ultimate, et j'ai une solution (dont le nom est TagID3Lib) contenant 2 projets.

    Voici le code de mon projet TagID3Lib (projet de type "Bibliothèque de classes) :

    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
    77
    78
    79
    80
    81
    82
    83
    // Fichier DefMedia.cs
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
     
    namespace TagID3Lib
    {
            class DefMedia
            {
                private string p;
     
     
                public string Titre { get; set; }
                public string Album { get; set; }
                public string Artiste { get; set; }
                public string URI { get; set; }
                public string Annee { get; set; }
                public string Type { get; set; }
                public string Genre { get; set; }
                public string Commentaire { get; set; }
     
                /*
                 * Constructeur
                 * parametres : string uri - Le chemine du fichier contenant le tag ID3v2 à extraire
                 */
                public DefMedia(string uri)
                {
                    this.URI = uri;
                    chargeMediaDepuisTagID3(uri);
                }
     
                /*
                 * Fonction chargeMediaDepuisTagID3
                 * parametres : string filePath - Le chemin du fichier contenant le tag ID3v2 à extraire
                 * 
                 * Cette fonction rempli les properties de la classe DefMedia
                 */
                private void chargeMediaDepuisTagID3(string filePath)
                {
                    using (FileStream fs = File.OpenRead(filePath))
                    {
                        if (fs.Length >= 128)
                        {
                            MusicID3Tag tag = new MusicID3Tag();
                            fs.Seek(-128, SeekOrigin.End);
                            fs.Read(tag.TAGID, 0, tag.TAGID.Length);
                            fs.Read(tag.Title, 0, tag.Title.Length);
                            fs.Read(tag.Artist, 0, tag.Artist.Length);
                            fs.Read(tag.Album, 0, tag.Album.Length);
                            fs.Read(tag.Year, 0, tag.Year.Length);
                            fs.Read(tag.Comment, 0, tag.Comment.Length);
                            fs.Read(tag.Genre, 0, tag.Genre.Length);
                            string theTAGID = Encoding.Default.GetString(tag.TAGID);
     
                            if (theTAGID.Equals("TAG"))
                            {
                                Titre = Encoding.Default.GetString(tag.Title);
                                Artiste = Encoding.Default.GetString(tag.Artist);
                                Album = Encoding.Default.GetString(tag.Album);
                                Annee = Encoding.Default.GetString(tag.Year);
                                Commentaire = Encoding.Default.GetString(tag.Comment);
                                Genre = Encoding.Default.GetString(tag.Genre);
     
                                /* DEBUG */
                                /*
                                    Console.WriteLine(Titre);
                                    Console.WriteLine(Artiste);
                                    Console.WriteLine(Album);
                                    Console.WriteLine(Annee);
                                    Console.WriteLine(Commentaire);
                                    Console.WriteLine(Genre);
                                    Console.WriteLine();
                                    Console.ReadLine();
                                */
                            }
                        }
                    }
                }
     
            }
    }
    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
    // Fichier MusicID3Tag.cs
    namespace TagID3Lib
    {
     
        class MusicID3Tag
        {
     
            public byte[] TAGID = new byte[3];      //  3
            public byte[] Title = new byte[30];     //  30
            public byte[] Artist = new byte[30];    //  30 
            public byte[] Album = new byte[30];     //  30 
            public byte[] Year = new byte[4];       //  4 
            public byte[] Comment = new byte[30];   //  30 
            public byte[] Genre = new byte[1];      //  1
     
        }
    }
    Ensuite j'ai un autre projet, ImportTag (de type application console) :

    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
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using TagID3Lib;
    namespace ImportTag
    {
        class Program
        {
            static void Main(string[] args)
            {
     
                string uri = @"D:\chanson.mp3";
                DefMedia m = new DefMedia(uri);
     
            }
        }
    }
    Rien qu'ici, j'ai des erreurs de la part de Visual Studio qui me dit que
    TagID3Lib.DefMedia en contient pas de constructeur qui accepte des arguments 1
    Une idée ? J'ai peu d'expérience en C# mais je suis à l'aise en POO en général.

    Merci d'avance !

  2. #2
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Pour ceux que ça intéresse je viens de trouver la réponse...

    Il s'avère qu'en C#, une classe par défaut est "private"... Chose que je trouve un peu débile dans ce langage au final car la plupart des classes que l'on fait sont publiques en général mais bon...

    Du coup il suffit de rajouter "public" devant le nom de la classe DefMedia et tout fonctionne...

    Si ça peut aider d'autres personnes...

  3. #3
    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 : 42
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Dark_TeToN Voir le message
    Il s'avère qu'en C#, une classe par défaut est "private"...
    C'est pas private, c'est internal (visible de tous les membres de l'assembly)

    Citation Envoyé par Dark_TeToN Voir le message
    Chose que je trouve un peu débile dans ce langage au final car la plupart des classes que l'on fait sont publiques en général mais bon...
    Bah non... normalement tu rends une classe publique uniquement si elle a besoin de l'être. C'est une mauvaise pratique de tout rendre public

  4. #4
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Chose que je trouve un peu débile dans ce langage au final car la plupart des classes que l'on fait sont publiques en général mais bon...
    Cite moi des langages dans lesquels la visibilité par défaut des classes est publique s'il te plait ?

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Citation Envoyé par MaximePalmisano Voir le message
    Cite moi des langages dans lesquels la visibilité par défaut des classes est publique s'il te plait ?
    JAVA !!!

    Les classes par défaut sont en public ! Elles sont visibles sans import dans le même package mais avec un pti coup d'import on les voit pas besoin de rajouter quoi que ce soit !

  6. #6
    Membre éprouvé

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juin 2011
    Messages
    487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2011
    Messages : 487
    Points : 945
    Points
    945
    Par défaut
    Donc tous les autres langages (Genre C++ ou autre) sont débiles parce que leur visibilité par défaut n'est pas la même que Java ? Intéressant ...

  7. #7
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par Dark_TeToN Voir le message
    JAVA !!!

    Les classes par défaut sont en public ! Elles sont visibles sans import dans le même package mais avec un pti coup d'import on les voit pas besoin de rajouter quoi que ce soit !
    Raté! En Java y'a le package-private, visibilité par défaut d'une classe et qui est strictement la même chose qu'internal.

    http://download.oracle.com/javase/tu...sscontrol.html

  8. #8
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Dark_TeToN Voir le message
    Il s'avère qu'en C#, une classe par défaut est "private"...
    Non, mais cela a déjà été dit.
    Accessoirement une classe private non imbriquée dans une autre n'a pas de sens et le compilateur le refuse.

    D'une manière plus générale, rien de ce qui est défini au niveau du scope namespace (class, enum, struct, delegate, interface) ne peut être private (car cela n'aurait aucun sens).

    Chose que je trouve un peu débile dans ce langage au final car la plupart des classes que l'on fait sont publiques en général mais bon...

    On en lit des trucs zarbi sur ce forum, mais celle là elle est pas mal.

  9. #9
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Désolé d'avoir été toujours habitué au Java, mais c'est juste que j'ai toujours eu l'habitude de travailler avec des classes publiques ou presque !

    Enfin j'y ai peut-être été un peu fort en traitant le langage de "débile" mais bon... Je reconnais que c'est pas si mal comme langage mais bon j'ai juste galéré une demi journée pour ça... c'est un peu embêtant ! Si seulement VS m'avait dit plutôt qu'il y avait des problèmes de visibilité !

  10. #10
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par Dark_TeToN Voir le message
    Désolé d'avoir été toujours habitué au Java, mais c'est juste que j'ai toujours eu l'habitude de travailler avec des classes publiques ou presque !
    A priori, ça traduit un problème de conception.

    Si seulement VS m'avait dit plutôt qu'il y avait des problèmes de visibilité !
    Mais il te le dit quand tu définis un membre sur une telle classe :

    "XXXX is inaccessible due to its protection level".
    Accessoirement, le fait qu'il ne te propose pas la classe non accessible dans l'Intellisense aurait du te mettre la puce à l'oreille.

  11. #11
    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 : 42
    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
    Points : 39 753
    Points
    39 753
    Par défaut
    Citation Envoyé par Dark_TeToN Voir le message
    Si seulement VS m'avait dit plutôt qu'il y avait des problèmes de visibilité !
    C'est vrai que dans certains cas les messages d'erreurs du compilateur ne sont pas très explicites et n'indiquent pas très bien l'origine du problème... Mais par rapport à d'autres langages (Haskell par exemple), c'est limpide

  12. #12
    Inactif  
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Janvier 2007
    Messages
    6 604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France

    Informations professionnelles :
    Activité : Chef de projet NTIC

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6 604
    Points : 13 314
    Points
    13 314
    Par défaut
    Citation Envoyé par tomlev Voir le message
    C'est vrai que dans certains cas les messages d'erreurs du compilateur ne sont pas très explicites et n'indiquent pas très bien l'origine du problème...
    C'est vrai mais dans le cas précis c'est limpide.
    Si tu tentes d'instancier une classe non accessible avec un constructeur qui n'existe pas, il met trois messages d'erreur. (un pour la definition, un pour l'instanciation, et un pour l'absence de constructeur).


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ClassInaccessible x = new ClassInaccessible(10);
    Error 1 'ClassInaccessible' is inaccessible due to its protection level
    Error 2 'ClassInaccessible' is inaccessible due to its protection level
    Error 3 'ClassInaccessible' does not contain a constructor that takes '1' arguments

  13. #13
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 200
    Points : 149
    Points
    149
    Par défaut
    Error 3 'ClassInaccessible' does not contain a constructor that takes '1' arguments
    Je n'avais vu que ce message d'erreur ! Le message "Due to its protection level" est apparu un peu après en essayant de bidouiller... :-P

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

Discussions similaires

  1. Utilisation d'une dll de ClearCase (IBM)
    Par il_a_ri dans le forum Outils
    Réponses: 6
    Dernier message: 28/11/2005, 15h29
  2. Réponses: 6
    Dernier message: 21/06/2005, 21h45
  3. [DLL] Utilisation d'une DLL pour utiliser serveur Firebird
    Par sekiryou dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/08/2004, 14h20
  4. [Info]Utilisation d'une Dll
    Par Assiobal dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 11/06/2004, 21h46
  5. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19

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