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

ASP.NET Discussion :

Interagir avec dll


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut Interagir avec dll
    Bonjour,

    Je dois depuis mon site Internet, interagir avec une dll qui a deja etait installé sur le serveur et qui est developpé par un autre service. Elle est amenee a evoluer.

    Par consequent je ne veux pas l'importer dans ma solution. Comment dois je faire alors ?

    Merci

  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
    Il faut que tu aies un assembly intermédiaire qui définit les interfaces implémentées par la DLL. Cet assembly devra être commun aux 2 parties (toi et le service qui implémente la DLL utilisée par le site), et sera référencé en dur des 2 côtés. C'est nécessaire pour établir un "protocole" d'interaction entre les 2. Ensuite l'implémentation de la DLL peut changer sans impacter le site, mais si l'interface change il faut la changer des 2 côtés

    Pour utiliser la DLL, il faut la charger dynamiquement avec Assembly.Load, et instancier par réflexion le type dont tu as besoin, puis le caster vers l'interface qui va bien. Ensuite tu manipules uniquement l'interface, sans avoir besoin de connaître les détails de l'implémentation.

    Un petit exemple pour que ce soit plus clair :

    Supposons que la lib s'appelle MaLib.dll, et qu'elle contient une classe Toto utilisée par le site

    Il faut créer une autre librairie (disons MaLib.Interop.dll), dans laquelle tu déclares une interface IToto qui décrit les membres publics de Toto. Il faut ajouter à MaLib.dll une référence vers MaLib.Interop.dll, et modifier la classe Toto pour qu'elle implémente IToto

    Du côté du site web, tu ajoutes aussi une référence à MaLib.Interop.dll (et pas à MaLib.dll). Tu charges dynamiquement MaLib.dll à partir du fichier de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Assembly asm = Assembly.LoadFile(@"le\chemin\vers\MaLib.dll");
    et tu crées une instance de Toto que tu affectes à une variable de type IToto :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Type typeToto = asm.GetType("LeNamespace.Toto");
    IToto toto = Activator.CreateInstance(typeToto) as IToto;

    De cette façon, tu ne références pas en dur les types de MaLib.dll, mais tu as quand même un moyen de les manipuler via l'interface.

    Evidemment, si Toto a des nouvelles fonctionnalités qui doivent être utilisées par le site, il faudra modifier l'interface IToto et recompiler les 2 projets

  3. #3
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    Merci pour ton explication tres claire.

    La seule chose qui me gene c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Assembly asm = Assembly.LoadFile(@"le\chemin\vers\MaLib.dll");
    Car je voudrais utiliser le ProgID et non le chemin de la dll car demain il peut changer.

  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
    Citation Envoyé par topolino Voir le message
    Car je voudrais utiliser le ProgID et non le chemin de la dll car demain il peut changer.
    Le ProgID ? C'est pour les composant COM ça, non ? J'ai répondu en supposant que la DLL dont tu parlais était un assembly .NET... Si ce n'est pas le cas, je ne pense pas pouvoir t'aider

  5. #5
    Membre éprouvé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Par défaut
    C'est une dll faite en C++.

    desole de ne pas l'avoir precisé avant

  6. #6
    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
    Dans ce cas il faut déclarer en C# les fonctions à utiliser de cette DLL, à l'aide de l'attribut DllImport :


    Côté C++ :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void FaireQuelqueChose(int x);
    Côté C# :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    [DllImport("MaLib.dll")]
    static extern void FaireQuelqueChose(int x);
    Et il faut que la DLL en question soit accessible dans le PATH

Discussions similaires

  1. Réponses: 6
    Dernier message: 20/10/2005, 21h36
  2. interagir avec la webcam
    Par black_code dans le forum Modules
    Réponses: 10
    Dernier message: 16/08/2005, 00h52
  3. conteneur de la STL (problème avec DLL et COM)
    Par moldavi dans le forum MFC
    Réponses: 8
    Dernier message: 25/07/2005, 22h43
  4. Réponses: 13
    Dernier message: 20/06/2005, 14h13
  5. [CR] Probleme avec Dll P2oledb.dll
    Par malban dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 30/08/2004, 09h10

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