HandleRef, structure
Assembly : mscorlib (dans mscorlib.dll)
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);
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.