这更像是一个建议而不是一个答案。
您可以要求将所有“句柄”方法放在一个单独的类中(我有一个名为User32
,coreDLL
等的类)。
然后,您可以在每次使用资源时增加一个计数器,或者将您创建的每个新句柄添加到私有管理列表中,然后再将句柄传回。
现在,在您的项目关闭之前,请确保您的计数器归零或列表中的所有句柄都已关闭。
未经测试的代码 - 我现在没有 VS2008。
[DllImport("User32")]
private extern static int GetGuiResources(IntPtr hProcess, int uiFlags);
private static List<IntPtr> m_handles = new List<IntPtr>();
public static IntPtr[] GetGuiResources() {
using (var process = Process.GetCurrentProcess())
{
var gdiHandles = GetGuiResources(process.Handle, 0);
m_handles.Add(gdiHandles);
var userHandles = GetGuiResources(process.Handle, 1);
m_handles.Add(userHandles);
}
return new IntPtr[] { m_handles[m_handles.Count - 2], m_handles[m_handles.Count - 1] };
}
public static void Close() {
for (int i = m_handles.Count - 1; -1 < i; i--) {
var handle = m_handles[i];
// release your handle
}
}
同样,这只是一个想法。我以前从来没有遇到过这个问题,所以我不知道它的效果如何,或者它是否会因为一些“我不知道”的原因而失败。
这就是我在逻辑上开始这个项目的方式。