Blog sur les technos .net
Puisque ces mystères me dépassent, feignons d'en être l'organisateur.

.NET et l'intéropérabilité PInvoke

By TheGrandBlack




L'intéropérabilité avec .net peut utiliser plusieurs canaux :

  • Web Services
  • COM
  • Enterprise Services
  • Plateform Invokation Services ( PInvoke )

C'est de ce dernier dont je souhaitait m'entretenir avec vous.
.net permet d'invoquer des fonctions placées dans des librairies windows (actuellement on peut parler de l'API win32 en .dll) en utilisant une classe d'attribut "DllImport".
Syntaxe :


[AttributeUsage(AttributeTargets.Method)]
public class DllImportAttribute: System.Attribute
{
public DllImportAttribute(string dllName) {...}
public CallingConvention CallingConvention;
public CharSet CharSet;
public string EntryPoint;
public bool ExactSpelling;
public bool PreserveSig;
public bool SetLastError;
public string Value { get {...} }
}

La classe d'attribut DllImportLes paramètres :
- CallingConvention
la convention d'appel (stdCall )
Attention : une convention d'appel définie 2 choses :
- L'ordre de passage des paramètres; de gauche à droite ou de droite à gauche.
- Qui va néttoyer la pile; l'appelant ou la méthode.
On parle alors des conventions suivantes : Pascal, cdecl, Register, stdCall, ...
Petite parenthèse à propos de la convention stdCall : Microsoft à indiqué lors de la sortie de l'API Win32 que cette convention devait être la convention par défaut de Windows, c'est pour cela que généralement vous allez rencontrer cette convention, mais rien ne le garantie donc vérifier dans la documentation ( comme disent les américains RFD = Read the Fucking Doc ) ou demander le prototype ou le fichier d'entête de la fonction.

- CharSet
Le jeu de caractères utilisé (Auto).
- EntryPoint
Nom du point d'entrée ( nom de la méthode)
- ExactSpelling
Corespondance des paramètres (false)
- PreserveSig
Signature préservée, sinon HRESULT et Out paramètre (True)
- SetLastError
Met à jour le flag SetLastError (false).

Exemple :

using System;
using System.Runtime.InteropServices;
namespace exDll
{
class Class1
{
[DllImport("user32.dll")]
static extern int MessageBoxA(int hWnd, string msg,string caption,int type);
static void Main(string[] args)
{
MessageBoxA(0,"Hello world","bonjour",0);
}
}
}
Bon pourquoi je vous parle de cela, alors que cette technique existe depuis le début du FrameWork;
tout simplement pour introduire un site qui est totalement dédié à cette partie dans .net;
je parle du site http://www.pinvoke.net/default.aspx
Ce site peut être tres utile si vous avez besoin de ce type d'intéropérabilité.
Il est crée sous forme de Wiki ( ou plus exactement c'est un FlexWiki, pour les connaisseurs), donc vous allez aussi pouvoir l'alimenter.
 

0 comments so far.

Something to say?