我已經在網上搜索了很多,但沒有找到一個好的解釋。我可以使用SafeHandle而不是IntPtr嗎?
我的問題很簡單。
我有一個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
,我想知道如果我可以用它來substite我IntPtr的手柄形式。如果可以,我該怎麼做?擴展抽象SafeHandle類不是問題,但是我可以直接將IntPtr替換爲SafeHandle(並使用默認編組)嗎?還是需要額外執行一些操作?
什麼好處呢'SafeHandle'給你,只是存儲'IntPtr'纔不是? – 2012-08-15 16:25:16
@ScottChamberlain - 'SafeHandle'是'IDisposable',並確保釋放句柄引用的資源。'IntPtr'只是一個可以傳遞的指針大小的值 - 它沒有處理語義。 – LBushkin 2012-08-15 16:31:01
假設你可以爲內存付費,除非你可以使用'Marshal.FreeBSTR','Marshal.FreeCoTaskMem'或Marshal.FreeHGlobal'去取指針內存,否則我認爲你不能安全地 - 從C#分配內存。使用'IntPtr',C#不會自動釋放任何內存。 – Pooven 2012-08-15 16:44:25