首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确发布SafeHandleZeroOrMinusOneIsInvalid或SafeHandle?

如何正确发布SafeHandleZeroOrMinusOneIsInvalid或SafeHandle?
EN

Stack Overflow用户
提问于 2015-01-19 02:36:15
回答 1查看 1.6K关注 0票数 1

我已经阅读了一些文档,下面是我用于IntPtr操作的类,以使它们更安全:

代码语言:javascript
复制
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方法中。我曾经这样用过,但我不知道这是不是正确的用法?也许还有另一种正确的方法来释放句柄并清除这个类?

我想以类似于(一个简单的例子)的方式使用这个类:

代码语言:javascript
复制
Process p = Process.Start(processName);
MySafeHandleOperator mh = new MySafeHandleOperator(p.MainWindowHandle);

如果有人看一下并说我做的一切都是正确的,或者这个方法需要重写,我将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2015-01-19 03:36:13

不,这看起来不太好。SafeHandle的目的是确保在将句柄传递给本机代码时,类对象不会被销毁。这可能会很糟糕,你的终结器会被调用,本机代码会继续使用无效的句柄。除了可能导致的运行时失败和损坏之外,还有一个非常可怕的句柄回收攻击场景。

但是,您完全无法控制该窗口句柄的生命周期。你不能阻止它被摧毁,你也不能自己做任何事情来摧毁它。好吧,假设你不打算用终结器杀死一个进程。通过不使用ReleaseHandle()的有用覆盖,您可能会发现一些问题。比方说,使用SafeFileHandle class作为实际派生类的示例。.NET框架有很多,一个好的反编译器是找到它们的绝佳方法。

长话短说,既然包装它没有意义,那么IntPtr就可以了

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28013317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档