微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – Windows 10上的.NET FontFamily内存泄漏

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 举报,一经查实,本站将立刻删除。

相关推荐