Beni MSDN'ye yönlendirmeden, bunların her birinin amacının ve bunların ne zaman kullanılacağını net ve açık bir şekilde açıklayabilir. (IntPtr, SafeHandle ve HandleRef)IntPtr, SafeHandle ve HandleRef - Açıklaması
cevap
IntPtr
yalnızca bir işaretçi (örneğin, 32-bit sistemler, 64 bit sistemlerde 64 bit boyutunda 32 bit boyutu) tutabilen basit bir tamsayı tabanlı bir yapıdır.
SafeHandle
, Win32 nesne tanıtıcılarını tutmayı amaçlayan bir sınıftır; nesne, nesne GC'ed olduğunda tanıtıcının kapalı olduğundan emin olan bir sonlandırıcıya sahiptir. SafeHandle
, soyut bir sınıftır çünkü farklı Win32 tanıtıcıları kapatılmaları gereken farklı yollara sahiptir. SafeHandle
'un kullanılmasından önce, IntPtr
, Win32 tutamaçlarını tutmak için kullanıldı, ancak bunların düzgün bir şekilde kapatılmasının ve GC'ed olmasının engellenmesi programcının sorumluluğundaydı. Bir P/Invoke çağrısının ortasında olduğunuzda yönetilmeyen bir tanıtıcının GC'ed olmadığından emin olmanın bir yoludur.
HandleRef
. HandleRef
gibi bir şey olmadan, yönetilen kodunuz P/Invoke çağrısından sonra tutamaçla bir şey yapmazsa, GC P/Invoke çağrısı sırasında çalıştırılmışsa, tanıtıcının hala kullanımda olduğunu ve GC'nin . SafeHandle
'un kapsüllenmiş tutamacın yönetiminin bir parçası olarak HandleRef
'u kullanabileceğini (ancak emin değilim ve bakmadım) hayal edin. Sorun, "a" olarak bulunduğu bir durumda, bu tutamak yakın olmasıdır
HWnd a = new HWnd();
IntPtr h = a.Handle;
// a is no longer needed and thus can be GC'ed
B.SendMessage(h, ...);
Bu varsayarsak
Küçük düzeltme. PInvoke sırasında * yönetilen * nesnesi GC'ed istemediğinizde HandleRef'i kullanın. e.g sınıfı HWnd {public IntPtr Handle; HWnd a = yeni HWnd(); B.SendMessage (a.Handle, ...); <- Bir PInvoke 'da GC'ed olabilir. B.SendMessage (yeni HandleRef (a, a.Handle)) <- şimdi PInvoke –
'da GC'ed olamaz. Başka bir ek: 'SafeHandle' referans sayımını içerir geri dönüşüm saldırılarını engeller. –
Güvenli kullanımın güvenlik görevlisi olduğunu doğrulayan var mı?Ya da en azından benzer bir mekanizma var mı? – Assimilater
HWnd a = new HWnd();
B.SendMessage(a.Handle, ...);
"a" programında, bu eşdeğerdir, sadece bir referanstır. Bu, SendMessage çağrısından önce veya sırasında gerçekleşirse, tutamaç geçersiz olur.
HandleRef, program bitmeden önce "a" nın çöp toplanmasını önler.
O HandleRef en KeepAlive davranışını dahil yok SafeHandle benziyor: Project Roslyn SafeHandle.cs http://referencesource.microsoft.com/#mscorlib/system/runtime/interopservices/safehandle.cs,743afbddafaea263
/*
Problems addressed by the SafeHandle class:
1) Critical finalization - ensure we never leak OS resources in SQL. Done
without running truly arbitrary & unbounded amounts of managed code.
2) Reduced graph promotion - during finalization, keep object graph small
3) GC.KeepAlive behavior - P/Invoke vs. finalizer thread ---- (HandleRef)
<...>
*/
Ama emin değilim, sadece kurucusuna sahte değer sağlanarak başarılmıştır edilebilir canlı tutma davranışı benziyor hangi basitçe nesneyi kesinleştirilemez olarak işaretler, bu durumda kaynak sızıntısını önlemek için SafeHandle's Dispose() öğesini manüel olarak çağırmanız gerekir, doğru muyum? birisi kaynak kodu açıklayabilir,
private extern void InternalDispose();
private extern void InternalFinalize();
nedir?
- 1. IntPtr yerine SafeHandle kullanabilir miyim?
- 2. HANDLE (IntPtr) Eski, kernel32.dll, IntPtr için SafeFileHandle
- 3. C# - Nasıl IntPtr ve Geri Nesne Dönüştürülür?
- 4. HWND'yi IntPtr (CLI) dönüştürün
- 5. C#, bir IntPtr
- 6. Bir IntPtr penceresi tanıtıcısını IWin32Window^
- 7. Sütun Google grafik açıklaması konum açıklaması
- 8. Func'in açıklaması
- 9. POCO'nun Açıklaması
- 10. R: Lejantın konumlandırılması ve uzunluğunun açıklaması
- 11. PyQt5 sinyal ve yuvası basit kod açıklaması
- 12. Killer Apps mimari açıklaması
- 13. Postacı eksik Durum Açıklaması
- 14. Tensorflow'da GRU hücresinin açıklaması?
- 15. İp veri yapısı açıklaması?
- 16. Dizi Dize Açıklaması
- 17. Nginx: $ request_time'ın açıklaması gerekiyor
- 18. Java'da kod açıklaması
- 19. JSF görüntülü HTML açıklaması
- 20. JVM bayt kodu açıklaması
- 21. iOS rotasyon matrisinin açıklaması
- 22. Johnson Algoritması grafiği açıklaması
- 23. Çoklu gösterge açıklaması
- 24. window.performance açıklaması javascript
- 25. @code java ek açıklaması,
- 26. Sudoku Çözücü Kod açıklaması
- 27. ek açıklaması görünmez mi?
- 28. kristal formülü açıklaması
- 29. ldd çıkışının açıklaması
- 30. IplImage * img'in açıklaması
MSDN ile ilgili sorun nedir? –
Hiçbir şey. Sadece bunları doğru şekilde kullandığımı garanti etmek için her birinin kısa bir özetini arıyorum. MSDN ve diğer insanların açıklamalarını okursam, yaptığım şeyin doğru olup olmadığını daha iyi hissediyorum. – user62572