3

私が管理しているWinFormsアプリケーションは、ごく一部のユーザーマシン(おそらく現在までに約4台)でクラッシュします。これらのユーザーの場合、アプリケーションは毎回クラッシュし、最初のダイアログが表示される前にクラッシュします。

例外

Source:
System.Drawing

Message:
Font 'Arial Black' does not support style 'Bold'.

Stack Trace:
at System.Drawing.Font.CreateNativeFont()
at System.Drawing.Font.Initialize(FontFamily family, Single emSize, FontStyle style, GraphicsUnit unit, Byte gdiCharSet, Boolean gdiVerticalFont)
at System.Drawing.Font.Initialize(String familyName, Single emSize, FontStyle style, GraphicsUnit unit, Byte gdiCharSet, Boolean gdiVerticalFont)
at System.Drawing.Font..ctor(String familyName, Single emSize, FontStyle style, GraphicsUnit unit, Byte gdiCharSet)

アプリケーションが使用するフォントの1つは、ArialBlackです。

this.label3.Font = new System.Drawing.Font("Arial Black", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));

このクラッシュが初めて発生したとき、ユーザーのコンピューターにあるフォントに気づきましたが、私のものではありませんでした。これは「ArialBlackItalic」と呼ばれ、1997年の日付です。これはファイル名です。

ARBLI___。TTF

ここに画像の説明を入力してください

ユーザーはWindowsXPを使用していました。

フォントを削除した後、アプリケーションは正常に実行されました。前述したように、過去22か月間に、このクラッシュは他の約3人のユーザーに発生しました。ユーザーのコンピューターから「ArialBlackItalic」フォントを削除するたびに、問題が解決したようです。

最近では、ユーザーはWindows 7を使用していて、フォントの日付ははるかに新しいものでしたが、前述のプロトコルで問題は解決しました。

この時点で、私はこのクラッシュバグの根本的な原因とそれを防ぐ方法を理解しようとしています。

4

1 に答える 1

0

このようなことを試してください。

using System.Drawing;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // Create regular font first.
            // Depending on the user's system, this font may already be bold.
            //

            var theFont = new System.Drawing.Font(
                "Arial Black",
                8.25F,
                System.Drawing.FontStyle.Regular,
                System.Drawing.GraphicsUnit.Point,
                ( ( byte )( 0 ) )
                );

            // If font is not bold, then try to create it.
            //

            if ( ( null != theFont ) && !theFont.Bold )
            {
                if ( theFont.FontFamily.IsStyleAvailable( FontStyle.Bold ) )
                {
                    theFont = new Font( theFont, FontStyle.Bold );
                }
            }

            // Now use the font.
            //

            this.label3.Font = theFont;
        }
    }
}
于 2012-06-01T19:25:07.537 に答える