如何正确处理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);
}
}
}
此外,虽然该类有一个AddMemoryFont()方法,但它没有相应的RemoveMemoryFont()方法。唯一的清理方法是调用PrivateFontCollection.Dispose()。这将删除集合中所有字体。根据与上一段中相同的规定,只有在确定不再使用任何Font对象时,才能调用Dispose()。过早调用它不会导致异常。
非常尴尬的行为,使用PFC的唯一真正安全的方法是在应用程序的整个生命周期中保留它。当然,在网络应用程序中相当痛苦。
您可以假设添加的字体是FontFamily[]数组中的最后一个。不是你现在实施的第一个。
根据AddFontMemResourceEx函数:
要删除已安装的字体,请调用RemoveFontMemResourceEx。但是,当该过程结束时,系统将卸载字体即使进程没有调用RemoveFontMemResource。
不过,我不认为你会那样做。这可能就是原因。