Мы используем PDFSharp (сборка GDI +) в одном из наших веб-приложений. В одном экспортере PDF мы используем несистемный шрифт TrueType, и он работает как шарм в нашей среде разработки, но вылетает, когда мы запускаем его в производство.
Ключевое различие (я думаю) между нашим разработчиком и производством заключается в том, что наши производственные серверы работают на 64-разрядной Windows Server 2008, а наш разработчик - на 32-разрядной версии 2008. Я написал крошечную тестовую программу для отладки.
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 из исходного кода и добавил отладочный код, чтобы понять, что происходит. Проблема в том, что вызов pinvoke для GetFontData возвращает -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 для пула приложений и пробовал запускать пул приложений под своими собственными учетными данными на случай, если возникли какие-либо проблемы, связанные с разрешениями, но безрезультатно.
WPF-сборка PDFSharp прекрасно работает, кстати, и вполне возможно, что мы просто переключимся на это, если не найдем никакого решения, но мне действительно любопытно, что может вызвать это.
Может кто-нибудь помочь мне с дальнейшими шагами по отладке? Чем среда отличается при работе в IIS / ASP.NET от консольного приложения, когда дело доходит до PInvokes?