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 :

DllImport avec nom dynamique


Sujet :

C#

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    Par défaut DllImport avec nom dynamique
    Bonjour,

    j'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [DllImport(@"maDll.dll",...
    mais le nom de cette dll est statique, est-il possible de modifier le nom de la dll dynamiquement ?

    Merci

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Non, ce n'est pas possible.

    Dans ce cas, il faut passer par un autre mécanisme et abandonner la facilité de [DllImport]. Il faut utiliser l'API Win32 directement, via des appels à LoadLibrary et GetProcAddress (et potentiellement FreeLibrary) d'un côté, et Marshal.GetDelegateForFunctionPointer de l'autre (qui permet de transformer un pointeur de fonction en délégate appellable).

    Une classe utile et réutilisable pour l'accès à l'API Win32 :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    static class NativeMethods
      {
        [DllImport("kernel32.dll")]
        public static extern IntPtr LoadLibrary(string dllToLoad);
     
        [DllImport("kernel32.dll")]
        public static extern IntPtr GetProcAddress(IntPtr hModule, string procedureName);
     
        [DllImport("kernel32.dll")]
        public static extern bool FreeLibrary(IntPtr hModule);
      }

    et enfin un exemple de code pour arriver à charger une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
    private delegate int MaFonction(int unParametre);
     
    static void Main(string[] args)
    {
       // Le préfix "n" ici est juste une convention que j'utilise, pour dire "natif"
       IntPtr nDll = NativeMethods.LoadLibrary(@"MaDllAuNomDynamique.dll");
       IntPtr nFonction = NativeMethods.GetProcAddress(nDll, "LaFonctionAAppeler");
       MaFonction fonction = (MaFonction)Marshal.GetDelegateForFunctionPointer(nFonction, typeof(MaFonction));
     
       int result = fonction(10);
       NativeMethods.FreeLibrary(nDll);
       Console.WriteLine(result);
    }
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    415
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 415
    Points : 125
    Points
    125
    Par défaut
    J'ai trouvé la solution ici, ça correspond à la solution proposée, merci.

  4. #4
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Comme quoi il est important de bien poser le problème pour avoir une bonne réponse.

    Le lien cité donne une solution pour charger une DLL depuis un emplacement dynamiquement, mais dont le nom reste identique. Il ne s'agit pas ici de charger une Dll en modifiant son nom dynamiquement. Différence subtile mais extrêmement importante !
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

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

Discussions similaires

  1. Document externe avec nom dynamique
    Par Wells dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 29/06/2008, 21h16
  2. MovieClip avec nom dynamique
    Par quakebest dans le forum Dynamique
    Réponses: 1
    Dernier message: 29/10/2007, 19h17
  3. Récupérer checkbox avec nom dynamique
    Par dumser1 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 24/04/2007, 11h02
  4. checked d'un checkbox avec nom dynamique
    Par Sylvain245 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 11/11/2005, 11h28
  5. [syntaxe]Creation table avec nom dynamique
    Par ZuZu dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/09/2004, 18h01

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