加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读