4

Web アプリケーションの 1 つで PDFSharp (GDI+ ビルド) を使用しています。ある PDF エクスポータでは、システム以外の TrueType フォントを使用しています。これは、開発環境では魅力的に機能しますが、本番環境で実行するとクラッシュします。

開発サーバーと本番サーバーの主な違い (私が思うに) は、開発サーバーが 2008 32 ビットを実行しているのに対し、運用サーバーは Windows Server 2008 64 ビットで実行されていることです。デバッグ用の小さなテスト プログラムを作成しました。

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 ビルドは非常にうまく機能し、解決策が見つからない場合はそれに切り替える可能性は十分にありますが、何が原因なのか非常に興味があります。

誰でも、さらにデバッグ手順を手伝ってもらえますか? PInvokes に関しては、IIS/ASP.NET で実行する場合とコンソール アプリケーションで実行する場合の環境はどのように異なりますか?

4

1 に答える 1

5

開発者がフォント メトリックを取得するために GDI+ に依存することは非常に一般的ですが、MSDN によると:

Windows サービス内での GDI+ 関数およびクラスの使用はサポートされていません。Windows サービスからこれらの関数とクラスを使用しようとすると、サービス パフォーマンスの低下や実行時の例外やエラーなど、予期しない問題が発生する可能性があります。

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;
...

これが、質問で述べたように WPF ビルドが機能しているのに、PDFSharp の GDI+ ビルドがサービスで機能しない理由です。

于 2011-05-26T17:42:42.837 に答える