- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经阅读了一些文档,这里是类,我将其用于 IntPtr 操作以使其更安全:
internal class MySafeHandleOperator : SafeHandleZeroOrMinusOneIsInvalid
{
public MySafeHandleOperator(IntPtr handle) : base(true)
{
SetHandle(handle);
}
public IntPtr GetPtr()
{
return this.handle;
}
protected override bool ReleaseHandle()
{
this.Dispose(true);
return true;
}
}
主要问题在 ReleaseHandle 方法中。我以这种方式使用过它,但我很想知道这是否是一种正确的使用方式?可能有另一种正确的方法来释放句柄并清除此类?
我想以类似于(一个简单示例)的方式使用此类:
Process p = Process.Start(processName);
MySafeHandleOperator mh = new MySafeHandleOperator(p.MainWindowHandle);
如果有人看一下我做的一切是否正确,或者是否需要重写此方法,我将不胜感激。
最佳答案
不,这看起来不太好。 SafeHandle 的要点是确保在将句柄传递给 native 代码时您的类对象不会被破坏。这可能很糟糕,您的终结器被调用并且 native 代码继续使用无效句柄。除了可能导致的运行时故障和损坏之外,还有由此启用的非常可怕的句柄回收攻击场景。
然而,您完全无法控制该窗口句柄的生命周期。你不能阻止它被摧毁,你也不能自己做任何事情来摧毁它。好吧,假设您不打算使用终结器终止进程。如果没有有用的 ReleaseHandle() 覆盖,您可能会发现一些问题。例如,使用 SafeFileHandle class作为实际派生类的示例。 .NET Framework 有很多,一个好的反编译器是找到它们的好方法。
长话短说,因为包装它没有意义,IntPtr 没问题
关于c# - 如何正确释放 SafeHandleZeroOrMinusOneIsInvalid 或 SafeHandle?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28013317/
我已经阅读了一些文档,这里是类,我将其用于 IntPtr 操作以使其更安全: internal class MySafeHandleOperator : SafeHandleZeroOrMinusOn
主要区别在哪里?我知道 SafeBuffer 派生 SafeHandleZeroOrMinusOneIsInvalid 但还有什么? 我应该什么时候使用其中一种? 我需要分配和控制原生数组(在 CPU
我是一名优秀的程序员,十分优秀!