Bonjour,
j'utilise
mais le nom de cette dll est statique, est-il possible de modifier le nom de la dll dynamiquement ?Code:[DllImport(@"maDll.dll",...
Merci
Version imprimable
Bonjour,
j'utilise
mais le nom de cette dll est statique, est-il possible de modifier le nom de la dll dynamiquement ?Code:[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:
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:
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); }
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 !