gpt4 book ai didi

c# - 使用 : HandleRef or IntPtr (newer source code from Microsoft no longer uses HandleRef) 哪个更好/更安全

转载 作者:可可西里 更新时间:2023-11-01 07:45:59 28 4
gpt4 key购买 nike

例如,在旧的 .NET Framework 2.0 源代码(Windows 窗体、Visual Studio 2005 - Whidbey)中,GetClientRect 函数是使用 HandleRef 定义的:

    [DllImport(ExternDll.User32, ExactSpelling=true, CharSet=CharSet.Auto)]
public static extern bool GetClientRect(HandleRef hWnd, [In, Out] ref NativeMethods.RECT rect);

在新的 Windows API 代码包(来自 Microsoft,2009/2010)中,使用 IntPtr 定义了相同的函数:

    [DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
internal static extern bool GetClientRect(IntPtr hwnd, ref CoreNativeMethods.RECT rect);

实际上,HandleRef 未在任何 Windows API 代码包源文件中使用,而在旧 .NET Framework 源文件中的 native 方法签名中大量使用。

最佳答案

这有点可疑。当句柄值存储在 SafeHandle 派生对象中时,不需要 HandleRef。代码包声明了 ZeroInvalidHandle,还有几个派生的,比如 SafeWindowHandle。

但是,它实际上并没有在任何地方使用这些 SafeHandle 类中的任何一个。不太确定是否真的需要,很多 Vista 和 Win7 扩展实际上是 COM 接口(interface)。不是传统的基于句柄的 C API。它们通过引用计数保持事件状态,因此不会受到这种垃圾收集器事故的影响。

就我个人而言,我从不担心这个。在执行 API 调用时收集类对象是一个错误。 API 调用完成后 微秒后,它很容易发生。仍然是一个错误,只是不是导致 API 调用失败的错误。不太确定我真的希望它不会失败,当我的代码中出现错误时,我更喜欢一个异常(exception)。微软需要保护自己免受这种情况的影响,他们不想因为异常而受到指责。我愿意。

关于c# - 使用 : HandleRef or IntPtr (newer source code from Microsoft no longer uses HandleRef) 哪个更好/更安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4335261/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com