Pinvoke dynamique

Soyez le premier à donner votre avis sur cette source.

Vue 16 506 fois - Téléchargée 934 fois

Description

Par PInvoke dynamique j'entend la spécification au runtime de l'emplacement de la dll dont on doit utiliser une des méthodes exportées.
Chose impossible avec l'attribut DllImport.

On peut distinguer 3 méthodes pour résoudre ce problème :

1) Utiliser la méthode SetDllDirectory de l'API Win32 (compatible .Net 1.1)
elle a cependant un "défaut" : le système doit au minimu être Windows XP SP1 ou Windows 2003 Server
2) Charger nous même la dll, à l'aide de LoadLibrary, avant que le Framework ne tente de le faire (compatible .Net 1.1)
3) Utiliser Marshal.GetDelegateForFunctionPointer en conjonction avec LoadLibrary et GetProcAddress (compatible uniquement .Net 2.0)

.Net 2.0 introduit la méthode Marshal.GetDelegateForFunctionPointer, qui va nous permettre d'initiliser un delegate, défini au préalable suivant la signature de la méthode visée, à partir de son adresse.

Vous trouverez dans le zip trois projets pour illustrer chacunes de ces méthodes, ainsi qu'un projet de dll, exportant une méthode (qui se contente de retourner le booléen qu'on lui passe...)
1) DynamicPInvokeXPSP1
2) DynamicPInvokeLoadBeforeFramework
3) DynamicPInvoke

Vous pouvez modifier le chemin d'accès à la dll dans le fichier app.config présent dans la solution (il est référencé en tant que fichier lié par les 3 projets WinForm).

Conclusion :


LIENS MSDN :

LoadLibrary : http://msdn.microsoft.com/en-us/library/ms684175.aspx
--
GetProcAddress : http://msdn.microsoft.com/en-us/library/ms683212.aspx
--
SetDllDirectory : http://msdn.microsoft.com/en-us/library/ms686203.aspx
--
Marshal.GetDelegateForFunctionPointer : http://msdn.microsoft.com/fr-fr/library/system.runtime.interopservices.marshal.getdelegateforfunctionpointer.aspx

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.