İnterneti çok araştırdım ama iyi bir açıklama bulamadım.IntPtr yerine SafeHandle kullanabilir miyim?
Soruma son derece basit.
Initialize adlı bir işlevi olan bir DLL'im var ve parametrelerden biri, sonraki çağrılar için kullanılacak bir tanıtıcı alan bir işaretçi. Başka bir parametre, tamlık için listeleyeceğim bir dizedir. Ben kullanıyorum imza (basit formunda) şöyledir: ": kolu alacak bir konuma Pointer KOLU" yorum ile Initialize(LPTSTR name, HANDLE handle)
:
[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);
DLL kendisinde imza olarak yazılır.
Ve sonraki çağrılar
[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);
Ben yaklaşık SafeHandle
okuma edilmiş ve benim ıntptr kolu için substite için kullanabilir acaba şeklindedir. Ve eğer yapabilirsem, nasıl yapabilirim? Özet SafeHandle sınıfını genişletmek bir sorun değil, ancak Intellect for SafeHandle'ı (ve varsayılan Marshalling'i kullanmam) doğrudan ekleyebilir miyim, yoksa ekstra bir şey mi yapmam gerekiyor?
SafeHandle
ve
IntPtr
arasındaki farkla ilgili daha kapsamlı bir cevap bulabilirsiniz
'yapar SafeHandle' sadece' IntPtr' saklamak size vermeye ne fayda değil? –
@ScottChamberlain - 'SafeHandle '' IDisposable '' ve tanıtıcı tarafından atıfta bulunulan kaynakların serbest bırakılmasını sağlar.IntPtr, etrafından geçirilebilecek bir işaretçi büyüklüğünde bir değerdir - yok etme semantiği yoktur. – LBushkin
Hafıza ücreti almanıza izin verildiğini varsayarak, “Marshal.FreeBSTR”, “Marshal.FreeCoTaskMem” veya “Marshal.FreeHGlobal” kullanarak işaretçi belleğini ayırmadıkça, güvenli bir şekilde belleği C# ile ayırın. 'IntPtr' kullanıldığında, C# otomatik olarak herhangi bir belleği boşaltmaya çalışmaz. – Pooven