Ce sujet n'a pas encore été évalué - Évaluez ce sujet

HandleRef, structure

Encapsule un objet managé contenant un handle d'une ressource passée à du code non managé à l'aide d'appel de plate-forme.

Espace de noms : System.Runtime.InteropServices
Assembly : mscorlib (dans mscorlib.dll)

[ComVisibleAttribute(true)] 
public struct HandleRef
/** @attribute ComVisibleAttribute(true) */ 
public final class HandleRef extends ValueType
JScript prend en charge l'utilisation de structures mais pas la déclaration de nouvelles structures.

Si vous utilisez l'appel de plate-forme pour appeler un objet managé et que l'objet n'est référencé nulle part ailleurs après l'appel de plate-forme, le garbage collector peut alors finaliser l'objet managé. Cette action libère la ressource et invalide le handle, ce qui entraîne l'échec de l'appel de plate-forme. L'encapsulation d'un handle avec HandleRef garantit que l'objet managé ne sera pas récupéré par le garbage collector avant la fin de l'appel de plate-forme. Pour obtenir une description des services d'appel de plate-forme, consultez Consommation de fonctions DLL non managées.

Le type valeur HandleRef, comme GCHandle, est un type spécial reconnu par le marshaleur d'interopérabilité. Un type GCHandle normal et non épinglé permet aussi d'empêcher une opération garbage collection inopportune même si HandleRef offre de meilleures performances. S'il est préférable d'utiliser HandleRef pour conserver un objet actif pendant la durée d'un appel de plate-forme, vous pouvez également utiliser la méthode GC.KeepAlive dans le même but.

Le constructeur HandleRef prend deux paramètres : Object et IntPtr représentant respectivement le wrapper et le handle non managé. Le marshaleur d'interopérabilité passe uniquement le handle à du code non managé et fait en sorte que le wrapper (passé comme premier paramètre au constructeur de HandleRef) reste actif pendant la durée de l'appel.

L'exemple suivant montre comment utiliser HandleRef pour garder actif un objet passé comme premier paramètre. Le marshaleur d'interopérabilité passe uniquement le handle à du code non managé.

FileStream fs = new FileStream("HandleRef.txt", FileMode.Open);
HandleRef hr = new HandleRef(fs, fs.SafeFileHandle.DangerousGetHandle());
StringBuilder buffer = new StringBuilder(5);
int read = 0;

// platform invoke will hold reference to HandleRef until call ends

LibWrap.ReadFile(hr, buffer, 5, out read, 0);
Console.WriteLine("Read with struct parameter: {0}", buffer);

Les membres statiques publics (Shared en Visual Basic) de ce type sont thread-safe. Il n'est pas garanti que les membres d'instance soient thread-safe.

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Édition Media Center, Windows XP Professionnel Édition x64, Windows XP SP2, Windows XP Starter Edition

Le .NET Framework ne prend pas en charge toutes les versions de chaque plate-forme. Pour obtenir la liste des versions prises en charge, consultez Configuration requise.

.NET Framework

Prise en charge dans : 2.0, 1.1, 1.0
Cela vous a-t-il été utile ?
(1500 caractères restants)

Ajouts de la communauté

AJOUTER
© 2013 Microsoft. Tous droits réservés.