如何正确处理PrivateFontCollection

本文关键字:PrivateFontCollection 正确处理 | 更新日期: 2023-09-27 18:29:02

我正在使用PrivateFontCollection在我的web服务器上安装上传的字体。下面的代码可以工作,但在第二次上传字体时,PrivateFontCollection会引用上传的第一个字体。所以有些东西没有得到正确的处理。有人发现我做错了什么吗?

 var fontName = string.Empty;
    using (var ms = new MemoryStream(fontBytes))
    {
        // used to store our font and make it available in our app
        using (var pfc = new PrivateFontCollection())
        {
            //create memory pointer
            IntPtr data = Marshal.AllocCoTaskMem((int)ms.Length);
            try
            {
                //copy the bytes to the unsafe memory block
                Marshal.Copy(fontBytes, 0, data, (int)ms.Length);
                // We HAVE to do this to register the font to the system (Weird .NET bug !)
                uint cFonts = 0;
                AddFontMemResourceEx(data, (uint)fontBytes.Length, IntPtr.Zero, ref cFonts);
                //pass the font to the font collection
                pfc.AddMemoryFont(data, (int)ms.Length);
                var fontWithMime = "data:application/x-font-truetype;charset=utf-8;base64," + cleanFontData;
                fontName = pfc.Families[0].Name;
                //db work here
            }
            finally
            {
                ms.Close();
                Marshal.FreeCoTaskMem(data);
            }
        }
    }

如何正确处理PrivateFontCollection

PrivateFontCollection是一个非常有缺陷的类,您必须非常小心地使用它。现有代码中的一个非常严重的错误是Marshal.FreeCoTaskMem()调用。这取决于您是否调用此函数,直到之后您的代码停止使用从族中创建的任何字体对象。如果不这样做会导致随机字形损坏,只有幸运的话才会得到AccessViolationException。潜在的问题是字体将继续使用您使用AllocCoTaskMem()分配的内存,它完全不知道内存不再有效。重新使用内存时会发生损坏。

此外,虽然该类有一个AddMemoryFont()方法,但它没有相应的RemoveMemoryFont()方法。唯一的清理方法是调用PrivateFontCollection.Dispose()。这将删除集合中所有字体。根据与上一段中相同的规定,只有在确定不再使用任何Font对象时,才能调用Dispose()。过早调用它不会导致异常。

非常尴尬的行为,使用PFC的唯一真正安全的方法是在应用程序的整个生命周期中保留它。当然,在网络应用程序中相当痛苦。

您可以假设添加的字体是FontFamily[]数组中的最后一个。不是你现在实施的第一个。

根据AddFontMemResourceEx函数:

要删除已安装的字体,请调用RemoveFontMemResourceEx。但是,当该过程结束时,系统将卸载字体即使进程没有调用RemoveFontMemResource。

不过,我不认为你会那样做。这可能就是原因。

相关文章:
  • 没有找到相关文章