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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 427
    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 confirmé

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    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);
    }

  3. #3
    Membre très actif
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    427
    Détails du profil
    Informations personnelles :
    Localisation : France

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

  4. #4
    Expert confirmé

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    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 !

+ 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