Comment implémenter un rappel de l'API native Windows en C #?
Question
J'ai une fonction API native qui ressemble:
DWORD WINAPI WlanRegisterNotification(
__in HANDLE hClientHandle,
__in DWORD dwNotifSource,
__in BOOL bIgnoreDuplicate,
__in_opt WLAN_NOTIFICATION_CALLBACK funcCallback,
__in_opt PVOID pCallbackContext,
__reserved PVOID pReserved,
__out_opt PDWORD pdwPrevNotifSource
);
Je l'ai traduit en c # comme:
[DllImport("Wlanapi.dll", EntryPoint = "WlanRegisterNotification")]
public static extern uint WlanRegisterNotification(
IntPtr hClientHandle, WLAN_NOTIFICATION_SOURCE dwNotifSource,
bool bIgnoreDuplicate, WLAN_NOTIFICATION_CALLBACK funcCallback,
IntPtr pCallbackContext, IntPtr pReserved,
[Out] out WLAN_NOTIFICATION_SOURCE pdwPrevNotifSource);
La fonction de rappel ressemble:
typedef VOID ( WINAPI *WLAN_NOTIFICATION_CALLBACK)(
PWLAN_NOTIFICATION_DATA data,
PVOID context
);
Je suppose que la version C # ressemblera à quelque chose:
public delegate void WLAN_NOTIFICATION_CALLBACK(
IntPtr pWlanNotificationData, IntPtr pContext)
Essentiellement, j'ai deux questions:
Un délégué est-il le bon objet à utiliser pour une méthode native qui attend un pointeur de fonction?
Et si oui, cela appellera-t-il automatiquement le délégué en C # lorsque la notification sera reçue?
La solution
Oui, vous devez utiliser un délégué, et oui, cela fonctionnera bien.
Cependant, vous devez vous assurer que le GC ne collecte pas votre instance de délégué. (généralement en le mettant dans un champ)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow