我在互联网上搜索了很久,但没有找到一个很好的解释。
我的问题很简单。
我有一个DLL,它有一个名为Initialize的函数,其中一个参数是一个指针,它将接收一个句柄,用于后续的调用。另一个参数是一个字符串,我将列出它的完整性。我使用的签名是(其简单形式):
[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);DLL本身中的签名为:Initialize(LPTSTR name, HANDLE handle),注释为“句柄:指向将接收句柄的位置的指针”。
随后的调用的形式是
[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);我一直在读关于SafeHandle的文章,我想知道我是否可以用它来修饰我的IntPtr句柄。如果可以的话,我该怎么做?扩展抽象SafeHandle类不是问题,但我可以直接用IntPtr代替SafeHandle (并使用默认编组)还是需要做额外的事情?
发布于 2012-08-15 16:26:51
关于SafeHandle和IntPtr之间的区别,您可以在这里找到一个更完整的答案: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与批判性终结
https://stackoverflow.com/questions/11973109
复制相似问题