Platform Invocation Services

Platform Invocation Services

P/Invoke

P/Invoke (aussi appelé 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.

Sommaire

Utilisation

Quand 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 :

  • Localiser l'emplacement de la DLL qui contient la fonction recherchée
  • Charger la DLL en mémoire
  • Trouver l'adresse en mémoire de la fonction et ajouter ses arguments dans la Pile d'appel
  • Convertir les types de données de .NET en un autre type

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

Le ramasse-miettes ne fonctionne pas à l'intérieur de la Platform Invocation Service; de même, la vérification de la validité des types ne fonctionne plus. Par conséquent, 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 particulière.

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);

Historique

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 maintenue actuellement par Microsoft.

Voir aussi

Références externes


References

Ce document provient de « P/Invoke ».

Wikimedia Foundation. 2010.

Contenu soumis à la licence CC-BY-SA. Source : Article Platform Invocation Services de Wikipédia en français (auteurs)

Игры ⚽ Поможем решить контрольную работу

Regardez d'autres dictionnaires:

  • Platform Invocation Services — Platform Invocation Services, commonly referred to as P/Invoke, is a feature of Common Language Infrastructure implementations, like Microsoft s Common Language Runtime, that enables managed code to call native code. Contents 1 Architecture 1.1… …   Wikipedia

  • Web Services Invocation Framework — Infobox Software name = Apache WSIF logo = caption = developer = Apache Software Foundation latest release version = 2.0 latest release date = January 27, 2003 operating system = Cross platform genre = Web Services license = Apache License 2.0… …   Wikipedia

  • Web Services — Dieser Artikel oder Abschnitt bedarf einer Überarbeitung. Näheres ist auf der Diskussionsseite angegeben. Hilf mit, ihn zu verbessern, und entferne anschließend diese Markierung. Ein Webservice oder Webdienst ist eine Software Anwendung, die mit… …   Deutsch Wikipedia

  • Java Platform, Standard Edition — or Java SE is a widely used platform for programming in the Java language. It is the Java Platform used to deploy portable applications for general use.In practical terms, Java SE consists of a virtual machine, which must be used to run Java… …   Wikipedia

  • Remote Desktop Services — Developer(s) Microsoft Stable release 7.0 (6.1.7600) / October 27, 2009 …   Wikipedia

  • Terminal Services — Infobox Software name = Terminal Services developer = Microsoft operating system = Microsoft Windows, Mac OS X latest release version = 6.0.6001.18000 latest release date = February 4, 2008 use = Remote Desktop Access license = MS EULA website =… …   Wikipedia

  • Open Mobile Terminal Platform — Type Industry Forum Industry Wireless Services Founded 2004 Products Industry recommendations , BONDI initiative Website http://ww …   Wikipedia

  • P/Invoke — (aussi appelé 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… …   Wikipédia en Français

  • Java Native Interface — (JNI)  стандартный механизм для запуска кода, под управлением виртуальной машины Java (JVM), который написан на языках С/С++ или Ассемблера, и скомпонован в виде динамических библиотек, позволяет не использовать статическое связывание. Это… …   Википедия

  • Java Native Access — (JNA) ist eine Java Programmbibliothek für den Zugriff auf plattformspezifische ( native ) dynamische Programmbibliotheken (DLL in Windows). Hierbei muss im Unterschied zu JNI kein plattform spezifischer Code geschrieben werden. JNA ist in der… …   Deutsch Wikipedia

Share the article and excerpts

Direct link
Do a right-click on the link above
and select “Copy Link”