Bonjour,
j'utilise
mais le nom de cette dll est statique, est-il possible de modifier le nom de la dll dynamiquement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part [DllImport(@"maDll.dll",...
Merci
Bonjour,
j'utilise
mais le nom de cette dll est statique, est-il possible de modifier le nom de la dll dynamiquement ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part [DllImport(@"maDll.dll",...
Merci
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
J'ai trouvé la solution ici, ça correspond à la solution proposée, merci.
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager