gpt4 book ai didi

c# - GetFontData 在 ASP.NET 应用程序中返回 -1 (GDI_ERROR),但在控制台应用程序中不返回。什么会导致这个?

转载 作者:太空狗 更新时间:2023-10-30 01:09:44 28 4
gpt4 key购买 nike

我们在我们的一个网络应用程序中使用 PDFSharp(GDI+ 版本)。在一个 PDF 导出器中,我们使用了一种非系统 truetype 字体,它在我们的开发环境中工作得很好,但在生产环境中运行时崩溃。

我们的开发和生产之间的主要区别(我认为)是我们的生产服务器在 Windows Server 2008 64 位上运行,而我们的开发运行 2008 32 位。我写了一个小测试程序来调试。

try
{
new XFont("ocrb10", 10, XFontStyle.Regular, new XPdfFontOptions(PdfFontEncoding.Unicode, PdfFontEmbedding.Always));
}
catch (Exception exc) { Console.WriteLine(exc.StackTrace); }

错误信息是InvalidOperationException:内部错误。无法检索字体数据。

at PdfSharp.Fonts.OpenType.FontData.CreateGdiFontImage(XFont font, XPdfFontOptions options)
at PdfSharp.Fonts.OpenType.FontData..ctor(XFont font, XPdfFontOptions options)
at PdfSharp.Fonts.OpenType.OpenTypeDescriptor..ctor(XFont font, XPdfFontOptions options)
at PdfSharp.Fonts.OpenType.OpenTypeDescriptor..ctor(XFont font)
at PdfSharp.Fonts.FontDescriptorStock.CreateDescriptor(XFont font)
at PdfSharp.Drawing.XFont.get_Metrics()
at PdfSharp.Drawing.XFont.Initialize()
at PdfSharp.Drawing.XFont..ctor(String familyName, Double emSize, XFontStyle style, XPdfFontOptions pdfOptions)

我从源代码构建了 PDFSharp 并添加了一些调试代码以了解发生了什么。问题是对 GetFontData 的 pinvoke 调用返回 -1 (GDI_ERROR)。 PdfSharp 作者在 FontData.cs 中添加了对此的评论错误发生的地方(搜索 GDI_ERROR),但他也没有找到合适的解决方案。

// Line 138 in FontData.cs, this GetFontData returns -1 here when 
// running as a web application on a 64bit windows host (regardles of WOW64
// being enabled or not)
int size = NativeMethods.GetFontData(hdc, 0, 0, null, 0);

现在,我遇到的问题是,当我将代码作为控制台应用程序运行时,无法在任何环境中重现此错误。我已经尝试为应用程序池打开和关闭 WOW64,并且我已经尝试在我自己的凭据下运行应用程序池以防出现任何与权限相关的问题,但无济于事。

PDFSharp 的 WPF 版本运行良好,顺便说一下,如果我们找不到任何解决方案,我们很可能会切换到它,但我真的很好奇是什么导致了这种情况。

任何人都可以帮我进一步调试步骤吗?就 PInvoke 而言,在 IIS/ASP.NET 中运行的环境与在控制台应用程序中运行的环境有何不同?

最佳答案

开发人员依赖 GDI+ 来检索字体规范是很常见的,但是 according to MSDN :

GDI+ functions and classes are not supported for use within a Windows service. Attempting to use these functions and classes from a Windows service may produce unexpected problems, such as diminished service performance and run-time exceptions or errors.

在 FontData.cs 中我发现了以下内容:

#if GDI
100 /// <summary>
101 /// Create the font image using GDI+ functionality.
102 /// </summary>
103 void CreateGdiFontImage(XFont font, XPdfFontOptions options/*, XPrivateFontCollection privateFontCollection*/)
104 {
105 System.Drawing.Font gdiFont = font.RealizeGdiFont();
106 NativeMethods.LOGFONT logFont;
...

这就是为什么 GDI+ 构建的 PDFSharp 在服务中不起作用,而 WPF 构建确实如您在问题中所述那样工作。

关于c# - GetFontData 在 ASP.NET 应用程序中返回 -1 (GDI_ERROR),但在控制台应用程序中不返回。什么会导致这个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6140996/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com