P/Invoke

P/Invoke de Microsoft est une spécification de l'implémentation de CLI, qui permet au managed code d'appeler du code natif dans les DLL.



Catégories :

.NET Framework - API Microsoft

Recherche sur Google Images :


Source image : technet.microsoft.com
Cette image est un résultat de recherche de Google Image. Elle est peut-être réduite par rapport à l'originale et/ou protégée par des droits d'auteur.

Page(s) en rapport avec ce sujet :

  • ... On choisit bien sur DLL comme type d'application, et on choisit de faire un... L'appel de P/Invoke est un service autorise du code managé... Seuls changent ici le nom de la DLL et le nom de la fonction à appeler.... (source : microsoft)
  • Le module non managé est une DLL qui définit une fonction nommée... Declare an unmanaged function type that takes two int arguments Note the use of... (source : msdn.microsoft)

P/Invoke (aussi nommé Platform Invocation Services) de Microsoft est une spécification de l'implémentation de CLI, qui permet au managed code d'appeler du code natif dans les DLL. Le code natif est référencé via les meta-données qui décrivent les fonctions exportées d'une DLL.

Utilisation

Lorsque P/Invoke est utilisé, le CLR gère le chargement des DLL et le conversion des types en types CTS. Pour réaliser cela, le CLR effectue les étapes suivantes :

P/Invoke est utile pour accéder à des DLL qui ne sont pas basées sur Microsoft. NET, surtout celles basées sur C ou C++.

Le ramasse-miettes ne fonctionne pas au sein de la Platform Invocation Service; de même, la vérification de la validité des types ne fonctionne plus. Donc, le programmeur doit être rigoureux dans sa programmation, sinon il y aura des Erreur de segmentation ou, (plus insidieusement... ) des Fuites de mémoire.

Si le programmeur se montre peu rigoureux sur la conversion de type, un mauvais alignement de données peut provoquer de gros problèmes.

Exemples

Le premier exemple montre comment obtenir la version d'une DLL spécifique.

Le prototype de la fonction DllGetVersion dans l'API Windows :

HRESULT DllGetVersion
(
    DLLVERSIONINFO* pdvi
)

Code C# pour appeler la fonction DllGetVersion :

[DllImport("shell32.dll")]
static extern int DllGetVersion(ref DLLVERSIONINFO pdvi);



Le second exemple montre comment extraire une icône d'un fichier :

Le prototype de la fonction ExtractIcon' :

HICON ExtractIcon
(      
    HINSTANCE hInst,
    LPCTSTR lpszExeFileName,
    UINT nIconIndex
);

Code C# pour appeler la fonction ExtractIcon :

[DllImport("shell32.dll")]
static extern IntPtr ExtractIcon(
    IntPtr hInst, 
    [MarshalAs(UnmanagedType.LPStr)] string lpszExeFileName, 
    uint nIconIndex);

L'exemple suivant plus complexe montre comment partager un évènement entre deux processus sur une plate-forme Windows

Le prototype de la fonction CreateEvent' :

HANDLE CreateEvent(
    LPSECURITY_ATTRIBUTES lpEventAttributes,
    BOOL bManualReset,
    BOOL bInitialState,
    LPCTSTR lpName
);

Code C# pour créer l'objet évènement :

[DllImport("kernel32.dll", SetLastError=true)]
static extern IntPtr CreateEvent(
    IntPtr lpEventAttributes, 
    bool bManualReset,
    bool bInitialState, 
    [MarshalAs(UnmanagedType.LPStr)] string lpName);

Le prédécesseur de Platform Invocation Service

Microsoft avait réalisé sa propre Java Virtual Machine; l'interface entre le code Java et les DLL était réalisée par la bibliothèque J/Direct (voir (en) J/Direct). Cette bibliothèque n'est plus tenue aujourd'hui par Microsoft.

Voir aussi

Références externes


References

Recherche sur Amazone (livres) :




Ce texte est issu de l'encyclopédie Wikipedia. Vous pouvez consulter sa version originale dans cette encyclopédie à l'adresse http://fr.wikipedia.org/wiki/P/Invoke.
Voir la liste des contributeurs.
La version présentée ici à été extraite depuis cette source le 17/03/2009.
Ce texte est disponible sous les termes de la licence de documentation libre GNU (GFDL).
La liste des définitions proposées en tête de page est une sélection parmi les résultats obtenus à l'aide de la commande "define:" de Google.
Cette page fait partie du projet Wikibis.
Accueil Recherche Aller au contenuDébut page
ContactContact ImprimerImprimer liens d'évitement et raccourcis clavierAccessibilité
Aller au menu