首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我可以用SafeHandle代替IntPtr吗?

我可以用SafeHandle代替IntPtr吗?
EN

Stack Overflow用户
提问于 2012-08-15 16:22:51
回答 1查看 14.9K关注 0票数 20

我在互联网上搜索了很久,但没有找到一个很好的解释。

我的问题很简单。

我有一个DLL,它有一个名为Initialize的函数,其中一个参数是一个指针,它将接收一个句柄,用于后续的调用。另一个参数是一个字符串,我将列出它的完整性。我使用的签名是(其简单形式):

代码语言:javascript
复制
[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);

DLL本身中的签名为:Initialize(LPTSTR name, HANDLE handle),注释为“句柄:指向将接收句柄的位置的指针”。

随后的调用的形式是

代码语言:javascript
复制
[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);

我一直在读关于SafeHandle的文章,我想知道我是否可以用它来修饰我的IntPtr句柄。如果可以的话,我该怎么做?扩展抽象SafeHandle类不是问题,但我可以直接用IntPtr代替SafeHandle (并使用默认编组)还是需要做额外的事情?

EN

回答 1

Stack Overflow用户

发布于 2012-08-15 16:26:51

关于SafeHandleIntPtr之间的区别,您可以在这里找到一个更完整的答案:IntPtr,SafeHandle和HandleRef -解释

但是,总之,在参数实际上是机器大小指针的情况下,应该使用IntPtr --在参数实际上是Win32句柄的情况下,应该使用Win32。这些类型通常是不可互换的;IntPtr的大小在不同的体系结构上会有所不同( x86上的32位,x64和amd64上的64位)。注意:在封面下面,我相信SafeHandle也使用IntPtr )。

而且,与IntPtr不同,当一个类型被垃圾收集时,SafeHandle实际上会执行资源的处理。这可以确保程序运行时不会泄漏系统资源(尽管在可能的情况下,您应该尽早使用Dispose() of SafeHandle实例)。请注意,SafeHandle实际上是抽象的,因为有许多不同类型的句柄,它们需要不同的方法来正确地处理和处理。

在特定情况下,您需要查看正在调用的DLL的文档。如果它是一个Win32 DLL,则可能已经存在一个SafeHandle类型。如果它是一个第三方DLL,那么您可以提交您自己的SafeHandle实现--假设除了Initialize()之外,还有一些版本的Release() (或等效的)。

关于IntPtr和SafeHandle的一些其他有趣的消息可以在以下网站上找到:

使用SafeHandle封装本机资源

SafeHandle类引用

SafeHandles与批判性终结

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

https://stackoverflow.com/questions/11973109

复制
相关文章

相似问题

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