在
Windows 10上,即使在调用dispose方法之后,System.Drawing.FontFamily.IsstyleAvailable方法似乎也将分配的空间留在内存中.
我写了一个简单的控制台应用程序来测试它:
using System; using System.Drawing; using System.Diagnostics; namespace ConsoleApplication1 { class Program { static string getMemoryStatusstring() { using (Process p = Process.GetCurrentProcess()) { return "(p: " + p.PrivateMemorySize64 + ",v:" + p.VirtualMemorySize64 + ")"; } } static void Main(string[] args) { string s = getMemoryStatusstring(); foreach(FontFamily fontFamily in FontFamily.Families) { Console.Write(fontFamily.Name + " " + getMemoryStatusstring() + " -> "); fontFamily.IsstyleAvailable(FontStyle.Regular); fontFamily.dispose(); Console.WriteLine(getMemoryStatusstring()); } string e = getMemoryStatusstring(); Console.WriteLine(s + " -> " + e); Console.ReadLine(); } } }
对于为什么会发生这种情况的任何想法?
提前致谢!
解决方法
如果存在内存泄漏,则会出现在gdiplus.dll中,FontFamily.IsstyleAvailable()实际上会对GdipIsstyleAvailable()进行外部调用.
来自ILSpy:
public bool IsstyleAvailable(FontStyle style) { int num2; int num = SafeNativeMethods.Gdip.GdipIsstyleAvailable(new HandleRef(this,this.NativeFamily),style,out num2); if (num != 0) { throw SafeNativeMethods.Gdip.StatusException(num); } return num2 != 0; }
这反过来定义为:
[DllImport("gdiplus.dll",CharSet = CharSet.Unicode,ExactSpelling = true,SetLastError = true)] internal static extern int GdipIsstyleAvailable(HandleRef family,FontStyle style,out int isstyleAvailable);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。