我已经阅读了一些文档,下面是我用于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);如果有人看一下并说我做的一切都是正确的,或者这个方法需要重写,我将不胜感激。
发布于 2015-01-19 03:36:13
不,这看起来不太好。SafeHandle的目的是确保在将句柄传递给本机代码时,类对象不会被销毁。这可能会很糟糕,你的终结器会被调用,本机代码会继续使用无效的句柄。除了可能导致的运行时失败和损坏之外,还有一个非常可怕的句柄回收攻击场景。
但是,您完全无法控制该窗口句柄的生命周期。你不能阻止它被摧毁,你也不能自己做任何事情来摧毁它。好吧,假设你不打算用终结器杀死一个进程。通过不使用ReleaseHandle()的有用覆盖,您可能会发现一些问题。比方说,使用SafeFileHandle class作为实际派生类的示例。.NET框架有很多,一个好的反编译器是找到它们的绝佳方法。
长话短说,既然包装它没有意义,那么IntPtr就可以了
https://stackoverflow.com/questions/28013317
复制相似问题