我有一个.NET 3.5应用程序,该程序使用PrivateFontCollection.AddMemoryFont将字体加载到内存中,并使用这些字体生成图像。我最近在Windows Server 2012 R2上安装了此软件,它会产生间歇性错误。

此方法说明了此问题:

private Bitmap getImage(byte[] fontFile)
{
    using (PrivateFontCollection fontCollection = new PrivateFontCollection())
    {
        IntPtr fontBuffer = Marshal.AllocCoTaskMem(fontFile.Length);
        Marshal.Copy(fontFile, 0, fontBuffer, fontFile.Length);
        fontCollection.AddMemoryFont(fontBuffer, fontFile.Length);

        Bitmap image = new Bitmap(200, 50);
        using (Font font = new Font(fontCollection.Families[0], 11f, FontStyle.Regular))
        {
            using (Graphics graphics = Graphics.FromImage(image))
            {
                graphics.DrawString(String.Format("{0:HH:mm:ss}", DateTime.Now), font, Brushes.White, new PointF(0f, 0f));
            }
        }
        return image;
    }
}

在Windows 7上,此操作始终如一。在Windows Server 2012 R2上,如果使用一种以上的字体反复调用,它将失败。例如:
getImage(File.ReadAllBytes("c:\\Windows\\Fonts\\Arial.ttf"));

即使被调用了数百次也可以工作,但是使用不止一种字体进行调用:
getImage(File.ReadAllBytes("c:\\Windows\\Fonts\\Wingding.ttf"));
getImage(File.ReadAllBytes("c:\\Windows\\Fonts\\Arial.ttf"));

将适用于前几次调用(大约20次),但随后将开始产生随机结果(第二次调用有时会返回带有带有翼型文本的图像-即它混合了字体)。

我也偶尔(很少)在DrawString调用中得到“GDI +中发生一般错误”。

这些错误在Windows 7上均不会发生。

我尝试了多种选择进行清理,但均未成功。

作为一种解决方法,我尝试将字体文件写入磁盘,然后使用AddFontFile加载,但是(在Windows 2012 R2上)字体文件在整个过程中都被锁定,因此无法删除。这使该选项 Not Acceptable 。

非常感谢您提供有关使AddMemoryFont持续工作或使AddFontFile解锁文件的任何帮助。

最佳答案

答案很晚,但也许其他人会对此感到满意:
我遇到了完全相同的问题,经过数小时的反复试验,我发现一个可行的解决方案是将字体(数据库中的字节数组)保存到本地文件,并使用addFontFile方法加载该文件。

所有的问题都消失了。不是理想的解决方案,而是可行的解决方案。

var path = Path.Combine(TemporaryFontPath, customFont.FontFileName);
if (!Directory.Exists(Path.GetDirectoryName(path)))
    Directory.CreateDirectory(Path.GetDirectoryName(path));
if(!File.Exists(path))
    File.WriteAllBytes(path, customFont.FontBytes);

using (var pvc = new PrivateFontCollection())
{
    pvc.AddFontFile(path);
    return pvc.Families.FirstOrDefault();
}

关于.net - PrivateFontCollection.AddMemoryFont在Windows Server 2012 R2上产生随机错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25583394/

10-12 02:02