【发布时间】:2012-08-11 23:21:04
【问题描述】:
我已经在互联网上进行了广泛的搜索,但没有找到很好的解释。
我的问题很简单。
我有一个 DLL,它有一个名为 Initialize 的函数,其中一个参数是一个指针,它将接收用于后续调用的句柄。另一个参数是一个字符串,为了完整起见,我将列出它。我使用的签名是(以简单的形式):
[DllImport(MyDll)]
static extern bool Initialize([In] string name, out IntPtr handle);
DLL 本身的签名写成:Initialize(LPTSTR name, HANDLE handle) 并带有注释“HANDLE:指向将接收句柄的位置的指针”。
而后续调用的形式为
[DllImport(MyDll)]
static extern bool DoSomething(IntPtr handle, uint randomParameter);
我一直在阅读有关SafeHandle 的信息,我想知道是否可以用它来代替我的 IntPtr 句柄。如果可以,我该怎么做?扩展抽象的 SafeHandle 类不是问题,但我可以直接用我的 IntPtr 替换 SafeHandle(并使用默认编组)还是需要做一些额外的事情?
【问题讨论】:
-
SafeHandle给您带来什么好处,而仅存储IntPtr没有? -
@ScottChamberlain -
SafeHandle是IDisposable并确保释放句柄引用的资源。IntPtr只是一个可以传递的指针大小的值 - 它没有处理语义。 -
假设您可以使用内存,除非您可以使用
Marshal.FreeBSTR、Marshal.FreeCoTaskMem或Marshal.FreeHGlobal取消分配指针内存,我认为您不能安全地使用从 C# 中取消分配内存。使用IntPtr,C# 将不会尝试自动释放任何内存。
标签: c# pinvoke marshalling handle