c# – Windows 10上的.NET FontFamily内存泄漏
发布时间:2020-12-15 20:56:24 所属栏目:百科 来源:网络整理
导读:在 Windows 10上,即使在调用Dispose方法之后,System.Drawing.FontFamily.IsStyleAvailable方法似乎也将分配的空间留在内存中. 我写了一个简单的控制台应用程序来测试它: using System;using System.Drawing;using System.Diagnostics;namespace ConsoleAppl
在
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); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |